请问汇编的JMP代码的机器码为什么是这样的?

会打代码的扫地王大爷 2017-05-06 03:45:49
    
002807fc <task_b_main>:
void task_b_main(struct SHEET *sht_back)
{
2807fc: 55 push %ebp
2807fd: 89 e5 mov %esp,%ebp
2807ff: 83 ec 0c sub $0xc,%esp
struct BOOTINFO *bi = (struct BOOTINFO *)ADR_BOOTINFO;
..........
}

我有一个函数在0x002807fc处
然后是我的跳转代码
       
appjmp:
JMP 0x2807fc ; eip, cs
RET
================
00281310 <appjmp>:
281310: e9 e7 f4 ff ff jmp 2807fc <task_b_main>
281315: c3

查了一下
Jmp near E9 转移到段内的任一位置

E9表示跳转,那后面跟着的地址为什么不是 fc 07 28 00,而是e7 f4 ff ff 这个莫名其妙的值?(不过能正常跳转到那个函数)
然后修改了一下
     
appjmp:
mov eax,0x2807fc
JMP eax
ret
===================
00281310 < appjmp >:
281310: b8 fc 07 28 00 mov $0x2807fc,%eax
281315: ff e0 jmp *%eax
281317: c3 ret

这段跳转代码对应的机器码就很正常,但是却跳转不到那个函数,请问是为什么呢,改怎么修改?
...全文
872 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
要看task_b_main的地址变了没有。
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
因为这里的jmp是一个相对地址跳转: 281310: e9 e7 f4 ff ff jmp 2807fc <task_b_main> 281315: c3 fffff4e7=2807fc-281315 至于后面的 281310: b8 fc 07 28 00 mov $0x2807fc,%eax 281315: ff e0 jmp *%eax 应该是可以的,为什么跳转不到,可能是因为你加了代码,那个函数的位置已经变了。
没有变呢,你也看到了代码变之前和变之后,都占用了0x281310 和0x281315。我也很莫名其妙,头疼
zhujinqiang 2017-05-12
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
因为这里的jmp是一个相对地址跳转: 281310: e9 e7 f4 ff ff jmp 2807fc <task_b_main> 281315: c3 fffff4e7=2807fc-281315 至于后面的 281310: b8 fc 07 28 00 mov $0x2807fc,%eax 281315: ff e0 jmp *%eax 应该是可以的,为什么跳转不到,可能是因为你加了代码,那个函数的位置已经变了。
  • 打赏
  • 举报
回复
因为这里的jmp是一个相对地址跳转: 281310: e9 e7 f4 ff ff jmp 2807fc <task_b_main> 281315: c3 fffff4e7=2807fc-281315 至于后面的 281310: b8 fc 07 28 00 mov $0x2807fc,%eax 281315: ff e0 jmp *%eax 应该是可以的,为什么跳转不到,可能是因为你加了代码,那个函数的位置已经变了。
大熊猫侯佩 2017-05-07
  • 打赏
  • 举报
回复
jmp有好几种形式,简单的方法是查看intel指令手册里面找到jmp指令,然后你可以查看你所需的形式. 或者你在ollydbg里面可以手动输入汇编代码然后查看生产的机器码.

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧