汇编语言(王爽)第三章 寄存器(内存访问)

3.1内存中字的存储

一个字(word)的长度为16位,即2个字节,而内存单元为单字节,所以要存储一个字长的数据,需要两个内存单元,并且字的高位存储在高地址单元,字的低位存储在低地址单元。比如数据:1188H,为16位数据,即一个字长,要将其存储在编号为0000H开始的内存中,那么编号为0000H的内存单元里存放88H,0001H的内存单元里存放11H。

3.2DS和[address]

8086CPU中的DS寄存器通常用来存放要访问的数据的段地址,比如要读取地址为10000H单元的内容,可以用如下代码:

mov bx,1000H

mov ds,bx

mov ax,[0]        //这里偏移地址为0,默认段地址在DS寄存器中

注:8086指令集不提供mov ds,直接数的操作方式。

检测点3.1

(1)ax=2662H;bx=E626H;ax=E626H;ax=2662H;bx=D6E6H;ax=FD48H;ax=2C14H;ax=0;ax=00E6H;

bx=0;bx=0026H;ax=000CH;

(2)

指令                  执行指令后:CS            IP            DS            AX           BX

mov ax,6622H                  2000H      0003H      1000H       6622H        0

jmp 0ff0:0100                  0ff0H        0100H      1000H       6622H        0

mov ax,2000H       0ff0H     0103H      1000H       2000H    0

mov ds,ax         0ff0H     0105H   2000H  2000H    0

mov ax,[8]        0ff0H      0108H      2000H   C389H   0

mov ax,[2]                    0ff0H     010BH      2000H   EA66H   0

代码和数据在内存中存放均为二进制形式,程序将其看为代码还是数据只取决于如何选用。

3.7CPU提供的栈机制:8086提供的出栈、入栈操作都是以字为单位的。SS:SP永远指向栈顶单元。

对于push操作:先将SP=SP-2;然后将被操作数存放到SS:SP开始的两个内存单元中(因为被操作数为一个字长)。

对于pop操作;先将SS:IP处存放的字放入到pop对象,再将SP=SP+2;使得栈顶更新。

POP/PUSH操作对象可以是寄存器,也可以是段寄存器或内存单元,比如:

push ax/pop ds/push [0011]

3.10栈段:通过SS和SP设定的栈空间称为栈段,栈段最大可以为64KB,取决于SP的取值范围(0000H~FFFFH);若将10000H~1FFFFH当作栈段,初始栈为空,SS=?,SP=?。

分析:1FFFFH>=ss*16+sp>=10000H

则:(1FFFFH-sp)/16>=ss>=(10000H-sp)/16

当sp=0000H时,上式等价于:1FFFH>=ss>=1000H

当sp=ffffH时,上式等价于:1000H>=ss>=0

上面两不等式交集为ss=1000H。

这里其实也很容易看出,只有SS=1000H时,栈的范围才可以取到10000H~1FFFFH中的所有。

下面分析SP,因为栈为空,所以当push操作时,栈顶指向栈底元素;这里栈底元素地址为1000H:FFFEH,即sp=sp-2=fffeH,那么原先的sp=fffe+2=0000H.

检测点3.2

(1)mov ax,2000H

       mov ss,ax

   mov sp,10H

(2)  mov ax,1000H

       mov ss,ax

   mov sp,0H

原文地址:https://www.cnblogs.com/tsembrace/p/3222948.html