请教王爽《汇编》“一个奇怪的程序”几个问题
本帖最后由 遒羽 于 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,执行
后,直接就跳转结束,请问这是怎么跳的??
谢谢!!
这里是程序刚开始执行,那连个指令依旧为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
就这样跳回去了
不是有赋值的嘛。。
mov ax,cs:
mov cs:,ax
这个执行后你自己u查看下命令,他把mov ax, 0 nopnop换了,变成jmp 0000指令了 メ㊣逆ご帅☆ 发表于 2013-2-6 18:51 static/image/common/back.gif
这里是程序刚开始执行,那连个指令依旧为NOP
mov si,offset s2
mov ax,cs:
原来如此!多谢! 遒羽 发表于 2013-2-6 18:56 static/image/common/back.gif
原来如此!多谢!
请问,在s中为什么jmp short s1没跳转到s1 七月之变 发表于 2013-2-6 16:22 static/image/common/back.gif
不是有赋值的嘛。。
mov ax,cs:
mov cs:,ax
请问,在s中为什么jmp short s1没跳转到s1 Road_7 发表于 2014-1-30 00:05 static/image/common/back.gif
请问,在s中为什么jmp short s1没跳转到s1
jmp指令不是指定地址,是指定偏移量 又多学习了一个。感谢。 谢谢,现在彻底知道了,{:5_95:}
页:
[1]