遒羽 发表于 2013-2-6 15:55:52

请教王爽《汇编》“一个奇怪的程序”几个问题

本帖最后由 遒羽 于 2013-2-6 16:11 编辑

王爽《汇编》实验8中有一题:
分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这个结果?
assume cs:code
code segment
      mov ax,4c00h
      int 21h
      
start:      mov ax,0
      s:      nop
                nop
               
                mov di,offset s
                mov si,offset s2
                mov ax,cs:
                mov cs:,ax
               
      s0:      jmp short s
      
      s1:      mov ax,0
                int 21h
                mov ax,0
               
      s2:      jmp short s1
                nop
               
code ends
end start
debug查看机器码:

下面是我的几个问题:
1,按照我的理解,程序执行完s后执行s0:jmp short s,这时候应该跳到s,又开始循环执行,对不对?这样是不是s成了一个死循环?
2,debug调试过程如下:

下面的S1,S2有被执行过吗,是怎样被执行的??
3,我们再看程序执行完s,也就是执行到mov cs:,ax的时候,程序跳转回s,执行

后,直接就跳转结束,请问这是怎么跳的??

谢谢!!

メ㊣逆ご帅☆ 发表于 2013-2-6 15:55:53


这里是程序刚开始执行,那连个指令依旧为NOP
mov si,offset s2
mov ax,cs:


这两句让AX=jmp short s1的机器码了
也就是F6EB(反过来读)

mov di,offset s
mov cs:,ax

这两句把jmp short s1这两个字节的机器码 替换掉 那两个字节的NOP
也就是说标号s处的指令成了机器码EBF6
EB表示JMP的机器码,F6表示位移数,F6是-10的补码
也就是向前跳10个字节,刚好来到开头
于是DEBUG翻译成jmp 0000


就这样跳回去了

七月之变 发表于 2013-2-6 16:22:54

不是有赋值的嘛。。
mov ax,cs:
mov cs:,ax
这个执行后你自己u查看下命令,他把mov ax, 0   nopnop换了,变成jmp 0000指令了

遒羽 发表于 2013-2-6 18:56:16

メ㊣逆ご帅☆ 发表于 2013-2-6 18:51 static/image/common/back.gif
这里是程序刚开始执行,那连个指令依旧为NOP
mov si,offset s2
mov ax,cs:


原来如此!多谢!

Road_7 发表于 2014-1-30 00:05:16

遒羽 发表于 2013-2-6 18:56 static/image/common/back.gif
原来如此!多谢!

请问,在s中为什么jmp short s1没跳转到s1

Road_7 发表于 2014-1-30 00:05:52

七月之变 发表于 2013-2-6 16:22 static/image/common/back.gif
不是有赋值的嘛。。
mov ax,cs:
mov cs:,ax


请问,在s中为什么jmp short s1没跳转到s1

七月之变 发表于 2014-1-30 09:07:04

Road_7 发表于 2014-1-30 00:05 static/image/common/back.gif
请问,在s中为什么jmp short s1没跳转到s1

jmp指令不是指定地址,是指定偏移量

bubu 发表于 2014-2-14 14:03:22

又多学习了一个。感谢。

freedomOO 发表于 2021-6-18 08:04:35

谢谢,现在彻底知道了,{:5_95:}
页: [1]
查看完整版本: 请教王爽《汇编》“一个奇怪的程序”几个问题