鱼C论坛

 找回密码
 立即注册
查看: 2688|回复: 3

[汇编作业] 监测点10.5

[复制链接]
发表于 2018-8-25 16:21:24 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 奥普瓯江 于 2018-8-25 16:32 编辑

(1)下面的程序执行后,ax中的数值为多少?(注意:用call指令的原理来分析,不要在Debug中单步跟踪来验证你的结论。对于此程序,在Debug中单步跟踪的结果,不能代表CPU的实际执行结果。)
assume cs:code
stack segment
        dw 8 dup (0)
stack ends

code segment
start: mov ax, stack                 ;把stack的段地址传给ax
        mov ss, ax                      ;把ax中的数据传给栈寄存器,作为栈使用
        mov sp, 16                     ;使得栈指针指向第16个字节(我也忘了是否叫不叫指针)
        mov ds, ax                      ;把stack的段地址传给ds(ax中以传入stack中的段地址)
        mov ax, 0                        ;ax等于0
        call word ptr ds:[0EH]        ;先把inc ax 中的偏移地址传入栈中在跳转,所以在这里inc ax中的地址是先压如到栈的第EF字节中然后在跳转inc ax中因为ds和ss调用的是同一个数据段stack
        inc ax                               ;ax自动加1
        inc ax                               ;ax自动加1
        inc ax                               ;ax自动加1
        mov ax, 4c00h
        int 21h
code ends
end start

答:ax最后等于3
        call基本原理是:
        inc的偏移地址(IP)入站,然后在跳转到从ds:[0EH]处取来的偏移地址处,这里里面因为站地址已经被ds调用了,所以跳转到的地址是inc第一个,inc一共有三个所以最后ax等于3

(2)下面的程序执行后,ax和bx中的数值为多少?
assume cs:code
data segment
       dw 8 dup (0)
data ends

code segment
start: mov ax, data                            ;把data内存首偏移地址传给ax
         mov ss, ax                               ;把ax中的偏移地址传给栈寄存器ss
         mov sp, 16                              ;把栈的偏移地址指向,第16个字节
         mov word ptr ss:[0], offset s     ;把标记s处的偏移地址存入内存段地址ss段偏移地址0中,由于调用的是word所以只存标记处s的偏移地址ip(两个字节)
         mov ss:[2], cs                          ;把当前执行寄存器cs中的地址,付给内存段地址ss段偏移地址是2,由于调用的是cs所以存入内存中的是连个字节
         call dword ptr ss:[0]                 ;先把s:mov这行的首地址(段地址,偏移地址)分别压入栈中段地址对应高位EF字节,偏移地址对应CD字节,然后调转到s:mov处,这里有一个nop命令这个该指令是站位符所以越过了他
         nop
         s:mov ax, offset s                    ;把s:mov的首偏移地址直接传给了ax
         sub ax, ss:[0CH]                      ;用内存地址中ss:[0CH]的地址减去ax中的数据此处应该是0因为call压入栈中的地址正是s:mov的偏移地址
         mov bx, cs                              ;把执行寄存器cs中的数据传给bx
         sub bx, ss:[0eH]                      ;用内存地址中ss:[0eH]的地址减去bx中的数据此处应该是0因为call压入栈中的段地址正是s:mov的cs寄存器中的数据
         mov ax, 4c00h
         int 21h
code ends
end start

答:最后ax和bx数值分别等于0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-26 19:44:23 | 显示全部楼层
你这个第二题里面我有个问题:
nop 为什么能够越过他?、
nop也占有一个字节的地址啊。
调试得到的ax=1。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-27 12:11:50 | 显示全部楼层
本帖最后由 奥普瓯江 于 2018-8-27 12:15 编辑
sannnnnd 发表于 2018-8-26 19:44
你这个第二题里面我有个问题:
nop 为什么能够越过他?、
nop也占有一个字节的地址啊。


那个是我错了,那个ax是1,bx是0,nop是占位符,他只是没有可执行的数据,当call执行的时候数据段记录的就是nop的内存地址,所以ax减去(ss:[0ch])中的数据得到的是1。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-27 21:44:11 | 显示全部楼层
看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 04:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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