. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验八还是没弄清楚,求人帮忙啊..  [已解决] 回复[ 5次 ]   点击[ 369次 ]  
kingwrcy
[帖 主]   [ 发表时间:2009-04-11 21:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12
首先我知道

mov di,offset s
                        
mov si,offset s2
                        
mov ax,cs:[si]
                        
mov cs:[di],ax

是把s2处的内容复制到s处.也就是s2处的EBF6复制到s处正好覆盖掉s处的2个nop,当程序走到s0:jmp short s
时.按道理说应该执行EBF6对应的汇编码.但是
-t

AX=0000  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0020  DI=0008
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0010   NV UP EI PL NZ NA PO NC
0BF4:0010 2E            CS:
0BF4:0011 8B04          MOV     AX,[SI]                            CS:0020=F6EB
-t

AX=F6EB  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0020  DI=0008
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0013   NV UP EI PL NZ NA PO NC
0BF4:0013 2E            CS:
0BF4:0014 8905          MOV     [DI],AX                            CS:0008=9090
-t
-- 下步是执行s0:jmp short s
AX=F6EB  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0020  DI=0008
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0016   NV UP EI PL NZ NA PO NC
0BF4:0016 EBF0          JMP     0008
-t

跳到s处后发现s处的2个nop被EBF6覆盖掉了,此时的IP=0008,如果执行EBF6,而F6是-10的补码.
那不是IP=IP-10=8-10=-2????????但是奇怪的是EBF6对应的机器码却是JMP 0000,也就是向前跳了8个字节.
为什么F6的补码是-10.不是8呢?这个地方老是搞不明白.求高手解答.
--下步就是s处的代码.
AX=F6EB  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0020  DI=0008
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0008   NV UP EI PL NZ NA PO NC
0BF4:0008 EBF6          JMP     0000
-
kingwrcy
[第1楼]   [ 回复时间:2009-04-11 21:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12
虽然最后的结果是可以跳到mov ax,4c00h这里来.但是不明白为什么EBF6不是往前面跳10个字节.而是8个字节呢?

我也知道jmp看的是偏移地址.问题是s处的地址是0BF4:0008,机器码是EBF6,往前跳10个.0008-0010=????但是对应的汇编码却又是JMP 0000,这个0000是根据哪里得来的?

这叫一个纠结啊...哎.
ddcw
[第2楼]   [ 回复时间:2009-04-11 21:21 ]   [引用]   [回复]   [ top ] 
荣誉值:11
信誉值:0
注册日期:2009-03-19 18:06
首先要明确,EBF6中,F6是位移,而且是二进制的补码形式。转化为10进制,是-10,转化为16进制数,是-Ah,不是什么-10h
  靠后的那个jmp指令位置是1454:0020,占用2个字节。因此,在执行这条指令以前(已取出,放入了缓冲器),ip自加2,指向了下一条指令的首地址1454:0022,然后执行指令EBF6,0022h-Ah=0018h(16进制减法),翻译成汇编指令是jmp 0018
  靠前的那个复制过去的指令,复制的是机器码EBF6,占用了1454:0008开始的两个字节单元。因此,执行这条指令时,ip是指向1454:00a0的。00a0-a=0000.翻译成汇编指令是jmp 0000.
  总结:一个exe程序中,所有的汇编代码都已经被转化为机器代码,也就是二进制的形式了。debug中的指令,是根据内存单元中的机器代码翻译过来的。因此,执行复制时复制的是二进制数据,不是指令本身。同一个数据,比如上面的EBF6,在不同的地方,可以解释为不同的汇编指令jmp 0018 和jmp 0000.当然,如果不包含位移,只包含绝对地址,那么机器指令处在内存中的任何位置,都解释为相同的汇编指令。
ddcw
[第3楼]   [ 回复时间:2009-04-11 21:23 ]   [引用]   [回复]   [ top ] 
荣誉值:11
信誉值:0
注册日期:2009-03-19 18:06
你们忘记ip要首先自加,按照自加后的ip作为基准进行计算
kingwrcy
[第4楼]   [ 回复时间:2009-04-11 23:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12
多谢楼上的.清楚了一些.一条指令进入缓冲器中后ip就会增加这条指令的长度了.也明白了2处EBF6翻译成不同的汇

编代码的原因了.因为jmp 只是针对偏移地址.和目的地址无关,然而在算这个偏移地址时.必须当做此条指令已经进

入了缓冲区.也就是ip要先增加N个字节.N取决于此条指令的长度.然后再根据JMP的偏移量算出jmp的真实的物理地

址.
kingwrcy
[第5楼]   [ 回复时间:2009-04-11 23:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12
此贴由 贴主 于 [ 2009-04-11 23:41 ] 结贴。 结贴原因:问题已解决
得分情况: 3楼(ddcw):8分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved