运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解
程序代码:
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
程序的执行结果是可以正常返回
只有本站会员才能查看附件,请 登录
(程序名为8.exe)分析程序,程序在内存中把s2处一个长为两个字节的jmp short s1移动到s处(nop为一字节指令)
看下图反汇编结果以及机器码
只有本站会员才能查看附件,请 登录
jmp short s1被翻译为ebf6,其中后一字节f6表示转移地址,f6代表的原码为10001010即-0ah,表示向上跳转十个字节,而执行此指令时ip指向0b3b:0022处的nop指令,向上跳转10正好到0b3b:0018即s1标号处,这才是jmp指令的本质,在内存中移动jmp指令后,执行依旧是按照偏移地址而不是标号来执行的,
mov ax,4c00h;3字节
int 21h;2字节
mov ax,0;3字节
jmp short s1;2字节,执行后向上偏移10字节继续执行,所以程序正常返回
[ 本帖最后由 Explorerlxz 于 2014-6-6 10:42 编辑 ]