小佛天下 发表于 2017-1-6 12:17:17

JMP指令的机器码问题?



求教这个JMP的机器嘛,与0123H这个IP地址是如何对应的?

insomnia丶 发表于 2017-1-6 15:47:11

系统是翻译过去的    只是说这个数据表示这个指令

人造人 发表于 2017-1-6 18:02:22

http://www.doc88.com/p-1127282654994.html

小佛天下 发表于 2017-1-6 19:48:53

谢谢楼的回答,这个图我看过,也知道如何换算,但这里的IP应该是0123H,但这个FF260000,换成二进制,是00100110吗?

人造人 发表于 2017-1-6 20:57:43

小佛天下 发表于 2017-1-6 19:48
谢谢楼的回答,这个图我看过,也知道如何换算,但这里的IP应该是0123H,但这个FF260000,换成二进制,是001 ...

ff26 应该是固定的,表示这种寻址方式
后面的0000,表示这种寻址方式的偏移地址

小佛天下 发表于 2017-1-6 21:58:57

哦,但如果FF26是固定的,0000是偏移地址,但这个程序运行的结果是IP=0123H,也就是说,JMP转到0123的,这个在机器码中没有体现吗?

小佛天下 发表于 2017-1-6 22:14:12


挺有意思 ,在ds:里换了好几个值,但JMP的机器码都没有变,依然是FF260000,这是为什么会固定的?

zealstar 发表于 2017-1-7 11:15:01

引自《汇编金手指》:
          <2> 段内间接转移指令: JMP OPRD
       例如: JMP BP               ; 转向(SS):(BP)
               JMP JNEAR      ; 转向(CS):(BX)+JNEAR
                JMP WORD PTR ; 转向(CS):(BX)+(DI)

<4> 段间间接转移指令:JMP OPRD其中的OPRD为存储器双字操作数.段间间接转移只能通过存储器操作数来实现.
      例如:指令JMP DWORD PTR,其操作数是一个双字类型的存储器操作数,它指向数据段DS,段内偏移为(BX).从这个DS:BX开始的前两个字节中,存放了目标地址的段内偏移值,后两个字节中,存放了目标地址所在的新的段的段基址,分别将它们送至IP及CS,便形成了新的转移地址.


楼主的指令 JMP WORD PTR DS:
实际上在编译器内只能认为是“段内”跳转,因为读取的是WORD字单元,但是又强制指定了DS段。本应执行的跳转是指向CS:0的,但是这里因为强制指定了DS段,所以出现了奇怪的现象……至于FF26这个段地址如何而来,只有天知道……

正确的指令应该是: jmp dword 或者jmp dword ds:
这样才能读取ds:0中的段地址与偏移地址!

fc1735 发表于 2017-1-8 02:49:11

{:10_266:}{:10_266:}来赚点积分.....
那个jmp word ptr ds:所对应的机器码是FF260000是在合理不过了,编译时总不会先找出ds:存放的值再跳到那个地址吧,这个代码是通用的阿,记录成跳转到ds:所存放的值的位置是最适合也跟原本写的代码最相关的阿,跟里面存放什么没关系吧,代码并没有先后顺序的关系阿,可以直接跳转到那段执行,而没有先去对ds:赋值阿
页: [1]
查看完整版本: JMP指令的机器码问题?