寄存器(内存访问)06 – 零基础入门学习汇编语言18
第三章:寄存器(内存访问)06
让编程改变世界
Change the world by program
push、pop指令
问题3.7
编程:将10000H~1000FH 这段空间当作栈,初始状态是空的,将 AX、BX、DS中的数据入栈。
思考后看分析。
push、pop指令
问题3.8
编程:
(1)将10000H~1000FH 这段空间当作栈,初始状态是空的;
(2)设置AX=001AH,BX=001BH;
(3)将AX、BX中的数据入栈;
(4)然后将AX、BX清零;
(5)从栈中恢复AX、BX原来的内容。
思考后看分析。
push、pop指令
从上面的程序我们看到,用栈来暂存以后需要恢复的寄存器中的内容时 ,出栈的顺序要和入栈的顺序相反,因为最后入栈的寄存器的内容在栈顶 ,所以在恢复时,要最先出栈。
问题3.9
编程:
(1)将10000H~1000FH 这段空间当作栈,初始状态是空的;
(2)设置AX=002AH,BX=002BH;
(3)利用栈 ,交换 AX 和 BX 中的数据。
思考后看分析。
push、pop指令
问题3.10
我们如果要在10000H处写入字型数据2266H,可以用以下的代码完成:
mov ax,1000H
mov ds,ax
mov ,ax,2266H
mov [0],ax
看题目:
补在10000H处写入字型数据2266H。
mov ax,2266H
push ax
要求:不能使用“mov 内存单元,寄存器”这类指令
思考后看分析。
我们看需补全代码的最后两条指令,将ax中的2266H压入栈中,也就是说,最终应由push ax将2266H写入10000H处。
问题的关键就在于:如何使push ax访问的内存单元是10000H。
Push指令是入栈指令。(注意执行过程)
完整的程序:
mov ax,1000H
mov ss,ax
mov sp,2
mov ax,2266H
push ax
结论
push、pop 实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。
同时,push和pop指令还要改变 SP 中的内容。
我们要十分清楚的是,push和pop指令同mov指令不同,CPU执行mov指令只需一步操作,就是传送,而执行push、pop指令却需要两步操作。
执行push时:先改变SP,后向SS:SP处传送。
执行pop时:先读取SS:SP处的数据,后改变SP。
注意
push、pop 等栈操作指令,修改的只是SP。也就是说,栈顶的变化范围最大为:0~FFFFH。
提供:SS、SP指示栈顶;改变SP后写内存的入栈指令;读内存后改变SP的出栈指令。
这就是8086CPU提供的栈操作机制。
栈的综述
- 8086CPU提供了栈操作机制,方案如下:
在SS,SP中存放栈顶的段地址和偏移地址;
提供入栈和出栈指令,他们根据SS:SP指示的地址,按照栈的方式访问内存单元。
- push指令的执行步骤:
SP=SP-2;
向SS:SP指向的字单元中送入数据。
- pop指令的执行步骤:
从SS:SP指向的字单元中读取数据;
SP=SP-2。
- 任意时刻,SS:SP指向栈顶元素。
- 8086CPU只记录栈顶,栈空间的大小我们要自己管理。
- 用栈来暂存以后需要恢复的寄存器的内容时 ,寄存器出栈的顺序要和 入栈的顺序相反。
- push、pop实质上是一种内存传送指令,注意它们的灵活应用。
栈是一种非常重要的机制,一定要深入理解,灵活掌握。
视频下载
技术, IT技术, 汇编语言, 视频教程
风险提示及免责条款
市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!