曲径通幽论坛

标题: 分析一个“奇怪”的程序 [打印本页]

作者: beyes    时间: 2009-4-1 01:21
标题: 分析一个“奇怪”的程序
[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。那么,nops1 开始处的位移为: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 标号 这样的表达,机器码里存放的确实是偏移地址(距离),而不是标号的地址。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2