《零基础入门学习汇编语言》第十八讲
本帖最后由 shuiyu 于 2017-7-10 23:22 编辑小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
问题3.7
将10000H~1000FH 这段空间当作栈,初始状态是空的,将 AX、BX、DS中的数据入栈。
解:
mov ax,1000H 由于不能直接把数据传输到段寄存器,所以要用通用寄存器作为过渡。
mov ss,ax
mov sp,0010H sp=000EH+2=0010H
push ax
push bx
push ds
问题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 sp,0010H 因为栈为空,所以sp=000FH+1=0010H
mov ax,001AH 设置AX=001AH
mov bx,001BH 设置BX=001BH
push ax 将AX、BX中的数据入栈;
push bx
mov ax,0 然后将AX、BX清零;
mov bx,0
pop bx 从栈中恢复AX、BX原来的内容。pop的顺序要注意,因为前面讲过“先进后出”
pop ax
问题3.9
(1)将10000H~1000FH 这段空间当作栈,初始状态是空的;
(2)设置AX=002AH,BX=002BH;
(3)利用栈 ,交换 AX 和 BX 中的数据。
mov ax,1000H 由于不能直接把数据传输到段寄存器,所以要用通用寄存器作为过渡。
mov ss,ax
mov sp,0010H 因为栈为空,所以sp=000FH+1=0010H
mov ax,002AH 设置AX=002AH
mov bx,002BH 设置BX=002BH
push ax 将AX、BX中的数据入栈;
push bx
mov ax,0 然后将AX、BX清零;
mov bx,0
pop ax 从栈中恢复AX、BX原来的内容。pop的顺序要注意,因为前面讲过“先进后出”
pop bx 现在我们先pop出ax,其实正在意义上是pop出了前面的bx,所以实现了交换 AX 和 BX 中的数据
问题3.10
我们如果要在10000H处写入字型数据2266H,可以用以下的代码完成:
mov ax,1000H
mov ds,ax
mov ,ax,2266H
mov ,ax
看题目:
补在10000H处写入字型数据2266H。
__________
__________
__________
mov ax,2266H
push ax
要求:不能使用“mov 内存单元,寄存器”这类指令
解:
mov ax,1000H 由于不能直接把数据传输到段寄存器,所以要用通用寄存器作为过渡。
mov ss,ax
mov sp,2 因为要指向栈的最底部单元下面的单元,故SP=SP+2(即指向10002H这个地方,运行时sp要-2,所以会写入10000H中)
mov ax,2266H
push ax
总结:
(1)push和pop指令同mov指令不同,CPU执行mov指令只需一步操作,就是传送,而执行push、pop指令却需要两步操作。
执行push时:
先改变SP,后向SS:SP处传送。
执行pop时:
先读取SS:SP处的数据,后改变SP。
(2)push、pop 等栈操作指令,修改的只是SP。也就是说,栈顶的变化范围最大为:0~FFFFH
(3)8086CPU提供了栈操作机制,方案如下:在SS,SP中存放栈顶的段地址和偏移地址;提供入栈和出栈指令,他们根据SS:SP指示的地址,按照栈的方式访问内存单元。
(4)push指令的执行步骤:
1.SP=SP-2;
2.向SS:SP指向的字单元中送入数据。
(5)pop指令的执行步骤:
1.从SS:SP指向的字单元中读取数据;
2.SP=SP+2。
(6)任意时刻,SS:SP指向栈顶元素。
(7)8086CPU只记录栈顶,栈空间的大小我们要自己管理。
(8)用栈来暂存以后需要恢复的寄存器的内容时 ,寄存器出栈的顺序要和 入栈的顺序相反。
(9)push、pop实质上是一种内存传送指令,注意它们的灵活应用。
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
页:
[1]