| 
 | 
 
 
发表于 2017-1-7 11:15:01
|
显示全部楼层
 
 
 
引自《汇编金手指》: 
          <2> 段内间接转移指令: JMP OPRD  
       例如: JMP BP               ; 转向(SS):(BP)  
               JMP JNEAR[BX]        ; 转向(CS):(BX)+JNEAR  
                JMP WORD PTR[BX][DI] ; 转向(CS):(BX)+(DI)  
 
<4> 段间间接转移指令:JMP OPRD其中的OPRD为存储器双字操作数.段间间接转移只能通过存储器操作数来实现. 
        例如:指令JMP DWORD PTR[BX],其操作数是一个双字类型的存储器操作数,它指向数据段DS,段内偏移为(BX).从这个DS:BX开始的前两个字节中,存放了目标地址的段内偏移值,后两个字节中,存放了目标地址所在的新的段的段基址,分别将它们送至IP及CS,便形成了新的转移地址. 
 
 
楼主的指令 JMP WORD PTR DS:[0] 
实际上在编译器内只能认为是“段内”跳转,因为读取的是WORD字单元,但是又强制指定了DS段。本应执行的跳转是指向CS:0的,但是这里因为强制指定了DS段,所以出现了奇怪的现象……至于FF26这个段地址如何而来,只有天知道…… 
 
正确的指令应该是: jmp dword [0]或者jmp dword ds:[0] 
这样才能读取ds:0中的段地址与偏移地址! 
 
 |   
 
 
 
 |