[Plain Text] 纯文本查看 复制代码 assume cs:codesg codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di, offset s //取得标号s所在处的地址
mov si, offset s2 //取得标号s2所在处的地址
mov ax, cs:[si] //cs:[si]的内容jmp short s1语句对应的机器码
mov cs:[di],ax //现在开始的两个nop的机器码已经被jmp short s1的机器码代替
s0: jmp short s //返回到标号s处,接下来就要执行 jmp short s1 的机器码了。
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
//程序能正常返回吗?程序的执行过程如何?
分析:
s0: jmp short s1 这是个重要的语句。这个语句将证明 jmp short s1 语句的机器码中存放的不是s1标号的地址,而是位移!
在把 jmp short s1 装入指令缓冲器时,IP 指向了 jmp short s1 下边的 nop 指令处。可以看到 nop 所在的地址为07122H(试验环境不同而不同),而 s1 处的 mov ax,0 的地址为 07118H。那么,nop 到 s1 开始处的位移为:07122H - 07118H = AH,所以(0-A)的补码为 F6---->所以,jmp short s1的机器码为 EB F6。
现在,标号s处的机器码为EB F6,当把这指令码读入缓冲器时,IP 指向 mov di, offset s,从这条指令开始处前向位移 AH 个字节,也就移到了 mov ax,4c00h 这里执行。
综上分析,可见这个程序是可以返回的!同时也证明了,jmp short 标号 这样的表达,机器码里存放的确实是偏移地址(距离),而不是标号的地址。 |