知识点
- 8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈)。
- 8086CPU的入栈和出栈操作都是以字为单位进行的。
- 8086CPU是如何知道内存里某一区间是栈的?
8086CPU中,有两个寄存器,段寄存器ss和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP 指向栈顶元素。
- 8086CPU存在栈顶超界的问题,当栈满的时候再使用push指令入栈,或栈空的时候再使用pop指令出栈,都将发生栈顶超界问题。
- 8086CPU不保证我们对栈的操作不会超界。这也就是说,8086CPU只知道栈顶在何
处(由SS:SP指示),而不知道我们安排的栈空间有多大。
问题3.7
编程,将10000H~1000FH 这段空间当作栈,初始状态栈是空的,将AX、BX、DS中的数据入栈。
代码
mov ax, 1000H
mov ss, ax
mov ax, 0010H
mov sp, ax
push ax
push bx
push ds
解析
- 前4行代码用于设定10000H~1000FH为栈,SP = 0010H,其计算过程是:
SP = 1000FH - 10000H + 1 = 0010H
mov ax, 1000H
mov ss, ax
mov ax, 0010H
mov sp, ax
问题3.8
编程:
(1)将10000H~1000FH这段空间当作栈,初始状态栈是空的;
(2)设置AX=001AH,BX=001BH;
(3)将AX、BX中的数据入栈;
(4) 然后将AX、BX清零;
(5)从栈中恢复AX、BX原来的内容。
代码
mov ax, 1000H
mov ss, ax
mov ax, 0010H
mov sp, ax
mov ax , 001AH
mov bx, 001BH
push ax
push bx
mov ax, 0H
mov bx, 0H
pop bx
pop ax