. : : 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
-
kingwrcy
[第1楼] [ 回复时间:2009-04-11 21:05 ] 
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12
虽然最后的结果是可以跳到mov ax,4c00h这里来.但是不明白为什么EBF6不是往前面跳10个字节.而是8个字节呢?

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

这叫一个纠结啊...哎.
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved