汇编学习-寄存器(内存访问)&栈机制

8086CPU中除了常见的AX,BX,CX,DX等4个通用寄存器外,还存在着其他不同类型的寄存器,如存储代码段地址的CS,以及代码段偏移地址的IP等。

这里先解释DS(存放数据段地址的寄存器)。8086CPU默认的将DS寄存器中存放的数据为内存单元的段地址。

8086CPU不允许直接对段地址进行赋值操作,因此如果想制定访问的内存地址,在设置段地址DS时,可以先将地址数据mov到AX中,然后再mov DS,AX。

而要设置内存中的地址偏移量时,可以直接使用mov [...]的方法,这里默认使用DS中的数据为段地址。例如mov [0],0010,对应的内存地址为DS * 16 + 0010


8086CPU提供栈的访问机制,利用SS寄存器存放栈的段地址,SP寄存器存放栈的偏移地址(或者将SP叫做栈内指针)

8086CPU提供push入栈操作和pop出栈操作,每次操作都是以字为单位进行的,也就是SP的移动量为+或者-2 。

栈是一种从高地址区向低地址区扩展的结构类型,其中SS * 16 + SP称为栈顶地址,栈顶地址中没有存放数据(可以这么理解)

假如目前SS = 1000,SP = 0010,栈顶地址为10010,push AX(AX = 1020),则地址10010中存放的是AX的高8位内容10,地址1000F中存放的是AX的低8位内容20。

即push操作后,SP = SP -2,pop操作后,SP = SP +2。

不过比较坑的是8086CPU并没有提供栈的越界提示,也就是说编程时要自己操心栈顶越界的问题(或者说栈的空间大小要我们自己去管理)。

如果将10000H到1FFFFH这段空间作为栈段的话,初始状态下栈是空的,那么显然SS = 1000,SP = ?

由于栈底字单元地址为FFFE,当最底的元素弹出栈后,SP = SP + 2,则SP = 0000。这里不考虑进位或者正负条件。


你可能感兴趣的:(汇编学习)