王爽汇编+9

今天进入了栈的学习,我们可以将一段连续的内存单元当做栈使用,栈中的数据遵循LIFO规则。记住的有:

栈中数据的增长(既push操作)是由高地址往低地址增长,所以是sp=sp-2

栈中数据的减少(既pop操作)是由低地址往高地址减少,所以是sp=sp+2

任何时候ss:sp指向栈顶单元,如果是push操作那么就是将数据从该地址处入栈,存入一个字型数据,如果是pop操作那么就是将该地址处开始的字型数据出栈

例如我们将1000:0开始的地址,1000:7结束的地址当做栈来使用,假设此时栈空,那么ss:sp的值分别是ss=1000h sp=8h

此时如果cpu执行的指令是push ax,那么首先将sp-2=8h-2h=6h,sp=6h,接着将ax寄存器中存放的一个字型数据放入ss:sp指向的地址,放入的字节顺序是高位地址存放寄存器中的高位字节 低位地址存放寄存器中的低位字节,如果cpu执行的指令是pop ax不是push ax,那么首先将sp+2=8h+2h=ah,sp=ah,接着将ss:sp指向的地址中的一个字型数据出栈并且放入ax寄存器中,注意此时发生了栈顶超界的问题,将该栈段以外的数据取出来了,原因是一开始栈是空的,此时pop操作将会发生栈顶超界的问题,反过来 当cpu不停的执行push操作,执行了4次,那么此时栈空间已满再执行第5次push的时候也将发生栈顶超界的问题,将栈段以外的数据改写了

发表回复