您的位置:首页 > 其它

第三章 --- 第六节

2012-01-04 20:29 134 查看
编程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实质上是一种内存传送指令,注意它们的灵活使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: