. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  实验八还是没弄清楚,求人帮忙啊..  [已解决] 回复[ 5次 ]   点击[ 371次 ]  
kingwrcy
[帖 主] [ 发表时间:2009-04-11 21:00 ] 
荣誉值: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
-
ddcw
[第2楼] [ 回复时间:2009-04-11 21:21 ] 
荣誉值: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.当然,如果不包含位移,只包含绝对地址,那么机器指令处在内存中的任何位置,都解释为相同的汇编指令。
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved