曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5254|回复: 0
打印 上一主题 下一主题

[8086] 分析一个“奇怪”的程序

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-1 01:21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[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 标号 这样的表达,机器码里存放的确实是偏移地址(距离),而不是标号的地址。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-20 11:46 , Processed in 0.080700 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表