汇编语言 手记8

栈有两个基本的操做:入栈和出栈spa

入栈:将一个新的元素放到栈顶指针

出栈:从栈顶取出一个元素code

 

栈顶的元素老是最后入栈,须要出栈时,又最早被从栈中取出。blog

 

栈的操做规则:LIFO内存

 

8086CPU提供相关的指令来以栈的方式访问内存空间。class

入栈出栈指令:im

PUSH(入栈)POP(出栈)数据

push ax   将寄存器ax中的数据送入栈中;img

pop ax   从栈顶取出数据送入axdi

均是以为单位进行的。

 

字型数据用两个单元存放,高地址单元放高8位,低地址单元放低8位。

 

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

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

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

 

push ax

1 sp=sp-2

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

当栈是空时,它指针会指向当前栈的最高地址的下一地址。

 

任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素。

因此SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2

栈最底部字单元的地址为1000:000E,因此栈空时,SP=0010H。

 

8086CPU的互做机理,只考虑当前的状况:

当前栈顶在何处

当前要执行的指令是哪一条。

 

将10000H-1000FH这段空间看成栈,初始状态是空的,将AX,BX,DS中的数据入栈

抹空操做

不用mov来实现写入操做

mov ax,1000H mov ss,ax mov sp,2 mov ax,2255H push ax

 

push pop实质上就是一种内存传送指令,能够在寄存器和内存之间传送数据,与mov指令不一样的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指定的。

push pop和mov不一样的是,mov只须要一步传送;而push pop指令却须要两步操做。

执行push时:先改变sp,后向ss:sp处传送

执行pop时:现读取ss:sp数据,后改变sp.

 

任什么时候刻ss:sp指向栈顶元素

8086只记录栈顶,占空间的大小要本身管理

 

若是内存从10000H-1FFFF,描述栈为空时:

任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素,因此SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2,栈最底部字单元的地址为1000:FFFE,因此栈空时,SP=0000H

 

CPU都是16为传送数据的,N<=64K.从栈操做指令所完成的功能的角度上来看,push pop等指令在执行的时候只修改SP.因此栈顶的变化范围是 0-FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0;若是再次压栈,栈顶将环绕,覆盖了原来的内容。

相关文章
相关标签/搜索