|
发表于 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中的段地址与偏移地址!
|
|