. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验八——个人分析  [已解决] 回复[ 4次 ]   点击[ 611次 ]  
zoudaokou2006
[帖 主]   [ 发表时间:2011-02-14 09:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07
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 

如上的程序可以正确返回。 
分析程序如下: 
(1) 
首先, 
        mov di, offset s 
        mov si, offset s2 
        mov ax, cs:[si] 
        mov cs:[di], ax 
这四条指令的作用是将s2处的指令一条指令拷贝到s处。 
(2) 
我们就要分析这条拷贝的指令 
        jmp short s1        ;E8 F6 
该指令为短转移,是根据位移进行转移的指令。 
jmp short s1对应的机器码为E8F6,位移为F6(-10)。 
在s2处,E8F6代表向前跳转到S1处。 
当将E8F6拷贝到s处,向前跳转10个字节,即跳转到mov ax, 4c00h指令处。 
(3) 
完成指令拷贝后, 
程序顺序执行到标号s0处, 
然后跳转到s处, 
然后继续跳转到 
        mov ax, 4c00h 
        int 21h 
程序正确返回。
zaixuexi
[第1楼]   [ 回复时间:2011-02-14 23:53 ]   [引用]   [回复]   [ top ] 
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28
1.你写的挺好的.

2.
这四条指令的作用是将s2处的指令一条指令拷贝到s处         
->                                              ;可以写的更详细些,呵呵
这四条指令的作用是将s2处的2个字节指令拷贝到s处
mov ax, cs:[si]  =>ax=0xF6E8
mov cs:[di], ax  =>s: db E8,0F6             
而这2个字节从jmp short s1起始,jmp short s1编译后正好为2字节大小
所以是将s2处的指令一条指令拷贝到s处
e8是jmp short的指令码,同时jmp short的范围是一个有符号字节的大小
即[-128,127],所以可以判断f6是负数
求补可得到原码0x0A,负数说明ip逆向行走ip=ip-10
当指令执行到jmp short s1时,ip=$+2                 ;$表示当前
也就是ip=mov di,offset s的地址,执行jmp时,ip=ip-10
通过计算或查指令手册可得
mov ax, 4c00h 到 mov di,offset s之间的偏移地址的差值恰好为0x0A
那么ip会回到mov ax,4c00h的偏移地址
整个过程中段地址没有发生变化.
zoudaokou2006
[第2楼]   [ 回复时间:2011-02-16 22:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07
回复:[第1楼]
------------------
你描述的太详细了,呵呵。
这个题还有一点挺妙的,就是那个位移10,其实不需要知道具体位移长度为10。
标号s往前的三条指令为:
           mov ax, 4c00h  
           int 21h  
           mov ax, 0 
标号s2往前的三条指令为:
        mov ax,0  
        int 21h  
        mov ax,0 
对比一下,前后的三条指令的除了数值不全一样,指令是完全一样的,所以长度也都是一样的。
这样有,
      从s2跳转到s1处MOV AX, 0的位移 = 从s处跳转到程序开始的mov ax, 4c00h的位移
由于jmp short指令记录的是位移,当jmp short s1指令拷贝到s处时,根据位移,就能转移到程序开始的
mov ax, 4c00h
int 21h
zaixuexi
[第3楼]   [ 回复时间:2011-02-16 22:45 ]   [引用]   [回复]   [ top ] 
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28
描述的越详细,思考的也会越多,各种知识点的关联会越紧密,共同进步.
zoudaokou2006
[第4楼]   [ 回复时间:2011-02-16 23:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07
此贴由 贴主 于 [ 2011-02-16 23:57 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(zaixuexi):6分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved