8086汇编基础 push,pop指令执行时,sp怎么变

首先需要说明的是栈属于满递减栈,即栈顶在高地址,栈底在低地址

push,指针向低处走。我向1000:0000处push数据,那么push之前,sp初-2=sp末。先sp-2,再写入

pop,指针向高处走。我要提取1000:0000处的数据。那么pop之前,sp=0002。先读取,后sp+2

也就是说 sp 始终指向了有效数据的位置。


一. 栈的执行过程下图:

8086汇编基础 push,pop指令执行时,sp怎么变_第1张图片

该图注意如下:

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

SS:存放栈的段地址;
SP:存放栈的偏移地址;

2. 栈底的地址大.

3. 栈是空的是什么意思?

例如: 将10000H----1000FH这段空间当作栈, 初始状态栈是空的,  此时, SS=1000H, 那么SP= ?

a. 栈底地址大.

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

所以, 栈底地址就是SS:SP=1000FH 也就是SS=1000H, SP=0FH

栈底就是栈的第一个元素, 那空栈就是SS=1000H, SP=10H.

 

二. PUSH的执行过程

8086汇编基础 push,pop指令执行时,sp怎么变_第2张图片

请记住:

1. SP先减2, SS:SP指向新的栈顶(SP是向小的方向走的)

2. 把数据送入新的栈顶.

 

三. POP的操作过程

8086汇编基础 push,pop指令执行时,sp怎么变_第3张图片

POP的过程就是与PUSH相反了

1. 把栈顶数据(SS:SP指向的数据)送入寄存器

2.SP增加2.

 

四. 栈的越界问题需要我们自己小心注意, CPU并没有机制来通知或者避免栈的越界.

五. PUSH与POP

PUSH和POP指令可以在寄存器和内存之间传送数据, 格式如下

PUSH 寄存器

POP 寄存器

PUSH 内存单元

POP 内存单元

PUSH和POP指令实质是一种内存传送指令, 可以灵活运用.




你可能感兴趣的:(Assembly)