call和jmp都是跳转指令,但是call的同时会把pc地址压入堆栈,并且这两种方式都有远和近跳转。下面的分析不全,因为没有在网上找到足够的资料,个人创造这个情景还是有些困难。1.例子中的call的机器码为0xe8。 0x400204ba <+30>: ...
call和jmp都是跳转指令,但是call的同时会把pc地址压入堆栈,并且这两种方式都有远和近跳转。下面的分析不全,因为没有在网上找到足够的资料,个人创造这个情景还是有些困难。
1.例子中的call的机器码为0xe8。
0x400204ba <+30>: e8 41 b6 05 00 call 0x4007bb00 <__printf>
0x400204bf <+35>: c9 leave
问题:0x4007bb00是如何计算得来的?
pc = 0x400204bf(取完当前指令之后,pc指向下一条语句)
另一个因为是是在x86机器上,所以是小端,那么下一个32位操作数就是0005b641,
pc + 操作数 =0x400204bf + 0x0005b641 = 0x4007bb00
2.jmp有多种跳转:
2.1.如果是远跳转,操作数是一个32位数,机器码e9
0x40011728 <+392>: e9 46 ff ff ff jmp 0x40011673 <_dl_open+211>
原标题:机器码call和jmp地址的计算
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。