. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  实验8程序分析  [待解决] 回复[ 92次 ]   点击[ 5082次 ]  
newasmer
[帖 主] [ 发表时间:2007-06-27 15:11 ] 
荣誉值:0
信誉值:0
注册日期:2007-06-26 14:20
实验8程序分析
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
执行流程:
程序从start处 mov ax,0开始执行,执行到mov cs:[di],ax,就把s2:处jmp short s1拷贝到s处,即覆盖2个nop(正好2个字节)
jmp short s1 在s2处,可以计算一下需要往上编译10个字节(3(jmp short s1)+3*2(mov ax,0)+2(int 21H)),
debug可以看到机器码为ebf6,f6是补码,转换一下即10,也即是向上偏移10个字节,这样的话s:处的2个nop的代码修改成
ebf6。
程序接着往下运行,跑到s0:jmp short s,这样又s:处,执行EBF6,即往上偏移10字节,计算一下就知道,ip这个时候指向0,
跑到codesg段开始处,即执行mov ax,4c00H;int 21H
yiruirui
[第60楼] [ 回复时间:2010-09-03 14:23 ] 
荣誉值:0
信誉值:0
注册日期:2010-09-03 12:59
对不起,刚才生气了发的帖子让大家见笑了。
这里我来给大家回答一下这个问题吧,相信大家 仔细看还是能看出楼上问题的。
一步一步的跟踪结果: 
0B58:0016  EBF0       JMP     0008H
0B58:0008H EBF6       JMP     0000   (我自己电脑中的数据)

0B58:0000  B8004C      MOV     AX,4C00
从这里开始分析,首先IP=16H(16进制)
此时细节如下:1。从IP=0016H中取指令,然后IP=IP+2(指令长度,不罗嗦)
2。此时IP执行0018H,
3。CPU执行 EBF0 则  IP=18H-16=8(注意F0是-16的补码,16是10进制,注意这里)
此时IP=0008H
然后从0008H中取指令,此时的指令为S2处的指令,前面4条指令已经把覆盖过了,这里的指令为JMP SHORT S1
他其实已经把S处的NOP NOP两个字节给覆盖了。
然后IP=IP+2(指令长度)=000AH
然后执行指令 EBF6 都知道F6是-10的补码,则IP=000AH-10(10进制,别糊涂了)=0H
则此时IP=0,也就是第一条指令的位置。OK,完毕!大家在琢磨琢磨吧!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved