编程1:
将10000H~1000FH这段空间当做栈,初始状态时空的,将AX、BX、DS中的数据入栈。
MOV AX, 1000H
MOV SS, AX
MOV SP, 0010H
PUSH AX
PUSH BX
PUSH DS
编程2:
(1)将10000H~1000FH这段空间当做栈,初始状态是空的;
(2)设置AX = 001AH,设置BX = 001BH;
(3)将AX、BX中的数据入栈;
(4)然后将AX、BX清零;
(5)从栈中恢复AX、BX原来的内容。
MOV AX, 1000H
MOV SS, AX
MOV SP, 0010H
MOV AX, 001AH
MOV BX, 001BH
SUB AX, AX
SUB BX, BX
POP BX
POP AX
编程3:
(1)将10000H~1000FH这段空间当做栈,初始状态是空的;
(2)设置AX = 002AH,BX = 002BH;
(3)利用栈,交换AX和BX中的数据。
MOV AX, 1000H
MOV SS, AX
MOV SP, 0010H
MOV AX, 002AH
MOV BX, 002BH
PUSH AX
PUSH BX
POP AX
POP BX
编程4:
我们如果要在10000H处写入字型数据2266H,可以用以下的代码完成:
MOV AX, 1000H
MOV DS, AX
MOV AX, 2266H
MOV [0], AX
看题目:
补在10000H处写入字型数据2266H
___________________________
___________________________
___________________________
MOV AX, 2266H
PUSH AX
要求:不能使用“MOV 内存单元, 寄存器”这类指令。
答案:
MOV AX, 1000H
MOV SS, AX
MOV SP, 0002H ;字型单元的地址是低地址
MOV AX, 2266H
PUSH AX
结论:PUSH、POP实际上是一种内存传送指令,可以在寄存器和内存之间传送数据,与MOV指令不同的是,PUSH和POP指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。
同时,PUSH和POP指令还要改变SP中的内容。
注意:
PUSH、POP等栈操作指令,修改的只是SP,也就是说,栈顶的变化范围最大为0~FFFFH。
栈的综述:
1、8086CPU提供了栈的操作机制,方案如下:
在SS,SP中存放栈顶的段地址和偏移地址;
提供入栈和出栈指令,他们根据SS:SP指示的地址,按照栈的方式访问内存单元。
2、PUSH指令的执行步骤
SP = SP - 2
向SS:SP指向的字单元中送入数据
3、POP指令的执行步骤:
从SS:SP指向的字单元中读取数据
SP = SP + 2
4、任意时刻,SS:SP指向栈顶元素。
5、8086CPU只记录栈顶,栈空间的大小我们要自己管理。
6、用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。
7、PUSH、POP实质上是一种内存传送指令,注意它们的灵活使用。