天天看点

浅谈汇编(2)——堆栈指令

  现今的CPU中都有栈的设计。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。

8086CPU提供入栈和出栈指令: (最基本的)

> PUSH(入栈) push ax:将寄存器ax中的数据送入栈中;

POP (出栈) pop ax :从栈顶取出数据送入ax。

8086CPU的入栈和出栈操作都是以字(两个字节)为单位进行的。

8086CPU中,有两个寄存器:

> 段寄存器SS  存放栈顶的段地址

寄存器SP  存放栈顶的偏移地址

任意时刻,SS:SP指向栈顶元素。

问题:如果我们将10000H~1000FH 这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=?

答:SP = 0010H

我们将10000H~1000FH 这段空间当作栈段,SS=1000H,栈空间大小为16 字节 ,栈最底部的字单元地址为1000:000E。

 任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS = 1000H,SP=000EH。

push ax(入栈)

(1)SP=SP–2;

(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

pop ax

(1)将SS:SP指向的内存单元处的数据送入ax中;

(2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

push 指令的执行过程
           
浅谈汇编(2)——堆栈指令
pop指令的执行过程
           
浅谈汇编(2)——堆栈指令

注意:

出栈后,SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH 处的2266H 依然存在 ,但是,它已不在栈中。

当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖

我们要十分清楚的是,push和pop指令同mov指令不同,CPU执行mov指令只需一步操作,就是传送,而执行push、pop指令却需要两步操作。

先改变SP,后向SS:SP处传送。
执行pop时:
先读取SS:SP处的数据,后改变SP。```





           

继续阅读