美文网首页
1.3_汇编(多段程序及内存定位)

1.3_汇编(多段程序及内存定位)

作者: JHPig | 来源:发表于2018-03-16 15:38 被阅读0次

——《编程语言》 王爽 著


1. 多段程序

我们现在知道内存可以数据段,代码段,栈空间;那么当我们在一个程序中同时包含数据和代码时,从内存角度来看,我们应该怎么解决这个问题呢?

  1. 在一个段中存放数据、代码、栈;
  2. 将数据、代码、栈放入不同的段中。

1.1 在代码段中使用程序

先看下列程序:

assume cs:code
code segment
    dw 0123h,0456h,0789h,0abch,0defh,ofedh,0cbah,0987h
    start:  mov bx,0
            mov bx,0
            
            mov cx,0
    s:      add ax,cs:[bx]
            add bx,2
            loop s
            
            mov ax,4c00h
            int 21h
code ends
end start

需要说明的几个问题:

1 dw的含义是define word,在这里,使用dw定义了8个字型数据;
2 end 后面的 start表明了程序的入口。end除了通知编译器程序在这里结束外,还可以通知编译器程序的入口在什么地方;
3 通过这种方法生成的数据,这8个数据存在于代码段的最开始,所以偏移地址为0,然后依次递增,8个字型数据存在于代码段的偏移0,2,4,6,8,A,C,E处。

1.2 在代码段中使用栈

程序的大概思路为先"dw"8个字型空间留给要用的数据,然后"dw"8个字型空的空间留做栈空间用。
假如我们设计将cs:10~cs:2F用做栈空间,那么需要在初始化设置时将cs段地址赋予ss中(中间经过ax寄存器做桥梁),然后将sp指向30h。

1.3 将数据、代码、栈放入不同的段

将数据、代码、栈都放在一起存在两个缺点:

  1. 把它们放到一个段中使程序显得混乱;
  2. 如果需要的空间超过64kb,既不能放在一个段中(8086模式中一个段的容量不能超过64kb)。

程序大概格式如下:

assume cs:code,ds:data,ss:stack
data segment
...
data ends

stack segment
...
stack ends

code segment
start:  mov ax,stack
        mov ss,ax
        mov sp,20h      ;指向栈顶
        mov ax,data
        mov ds,ax       ;指向data段
...
code ends

end start

这个代码一共定义了三段空间,通过名称“data”等来传递段地址,即在进行空间的定义的时候,在物理上就将三个空间分开,然后调用其相应的段地址即可。
此处再进行强调依次,在对段地址寄存器进行操作的时候,不能直接对其赋值,而应通过ax等寄存器作为桥梁。

2. 更灵活的内存定位

基础知识点:

  1. and和or指令的用法;
  2. 通过db ‘(字母)’的形式将对应的ASCII码值提取出来,db的意思是define byte;
  3. 字母的大小写转换问题,仔细研究一下ASCII表中大小写字母的区别,差值固定;
  4. [bx + idata] 的意思是 [(bx)+ idata](意义:为高级语言实现数组提供了便利机制);
  5. 提供了SI,DI两个16位寄存器,但是这两个寄存器并不能拆分成两个8位寄存器,功能和BX相近;

结论:

  1. [idata]用一个常量来表示地址,可用于直接定位一个内存单元;
  2. [bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;
  3. [bx+idata]用一个变量和常量表示地址,可在一个其实地址的基础上用变量简洁的定位一个内存单元;
  4. [bx+si]用两个变量表示地址;
  5. [bx+si+idata]用两个变量和一个常量表示地址。

相关文章

  • 1.3_汇编(多段程序及内存定位)

    ——《编程语言》 王爽 著 1. 多段程序 我们现在知道内存可以数据段,代码...

  • RAM学习路线03-RAM汇编语言

    1. ARM汇编程序的结构 1.1 段 ARM的汇编语言程序由段组成,段是相对独立的指令或数据单位,每个段...

  • 汇编程序基础

    汇编程序基础 一、汇编程序基本结构 二、汇编指令 1.汇编指令基本结构 三、伪指令 1.段定义 2.数据定义 数据...

  • 简单汇编

    程序的本质 软件\程序的执行过程 寄存器和内存 编程语言的发展 汇编语言的种类 ios 最主要的汇编语言 AT&T...

  • 7.13

    Java与C++区别:对内存:彻底隐藏指针、提供垃圾回收机制减少内存泄漏程序崩溃后可以根据调用栈及Log定位错误位...

  • 7-3 汇编学习笔记(2)

    2019_7_03 3.硬盘和显卡访问和控制 1)用户程序的结构 分段,段的汇编地址和段内汇编地址 一个规范的程序...

  • 操作系统-哲学原理(第一篇 基础)

    $0: 计算机将程序(高级程序-》汇编程语言-》机器语言)加载到内存中然后由操作系统从内存中调度到CPU上执行,加...

  • Golang GC

    内存分区 代码经过预处理、编译、汇编、链接4步后⽣成⼀个可执⾏程序。在 Windows 下,程序是⼀个普通的可执⾏...

  • 2.汇编-内存

    2.汇编-内存 寄存器数量和容量有限,为了存储大量数据,所以我们需要内存 每个程序都会有自己的独立的4GB内存空间...

  • 基础-5

    多个代码段的程序 这种思想即: 将程序分为代码段,数据段,栈段为规范内存的使用,程序员是不能随便决定内存空间的使用...

网友评论

      本文标题:1.3_汇编(多段程序及内存定位)

      本文链接:https://www.haomeiwen.com/subject/opqrqftx.html