鱼C论坛

 找回密码
 立即注册
查看: 2722|回复: 0

[学习笔记] 《零基础入门学习汇编语言》第十八讲

[复制链接]
发表于 2017-6-27 23:00:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 shuiyu 于 2017-7-10 23:22 编辑

小白刚学,不对的请各位大佬指正,谢谢

问题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 [0],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实质上是一种内存传送指令,注意它们的灵活应用。





谢谢小甲鱼带来的视频教程,感谢!!


   
本节结束,多谢览阅!
小白刚学,不对的请各位大佬指正,谢谢

评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 13:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表