[汇编]JMP 指令 地址该写多少 2021.4.6

假如说要在00402000出写下跳转到00401000处用16进制该怎么写?

根据Intel x86   JMP指令的16进制为E9,所以地址为E9 XXXXXXXX,需要注意的是XXXXXXXX地址值不是要跳转的绝对地址值,而是从当前JMP命令到跳转位置的相对距离。

JMP指令转换为机器码时,需要计算当前EIP和目标地址的差,但是JMP指令占五个字节,JMP还没执行时,当前EIP的值是JMP指令首地址+5个字节。

 

因为 当前EIP+5+X = 目标地址

所以 X =目标地址 - 当前EIP -5

如果目标地址在当前地址后,那就简单了   比如  00401000 跳转到 00402000 

                                                                    直接   00402000-(00401000+5)=0000FFB

如果目标地址在当前地址前,比如  00402000 跳转到 00401000 

                                                    就要 先跳转到结尾 FFFFFFFF-00402005 

                                                    再跳转至开头        FFFFFFFF-00402005 +1

                                                     再跳转至目标     FFFFFFFF-00402005 +1 +00401000

                                                == 100000000+00401000-00402005 因为进位法则

                                                ==00401000 - 00402005 

              == FFFFEFFB

                                                == 目标地址 -(源地址 +5)

 

补充:

    也许有人会觉得奇怪   从00402005 跳转到  00401000  为什么  是 FFFFEFFB   而不是  -00001005呢    往回跳1005不就好了  如下图示

 

 可是二进制的世界里是没有正负之分的,要想从00402005 跳转到  00401000 就必须  先从00402005 跳转到FFFFFFFF再跳一步溢出到00000000 再跳转到00401000   如下图所示

 

 

 

    

posted @ 2021-04-05 13:33  乘舟凉  阅读(784)  评论(0编辑  收藏  举报