高分求救:有关内嵌汇编!!急!!!

CoolQ 2002-07-10 05:12:41
我在C语言中使用内嵌汇编
__asm__
("
jmp 0x2a
")
其中的jmp 0x2a到底是绝对跳转还是相对跳转?我想应该是相对跳转,可是反汇编后却是绝对跳转。我该如何用jmp实现相对跳转呢?我的环境是linux7.2 + gcc2.96 + gdb5.0,希望大家指点!不够分再给!!!
...全文
21 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengpan_panpan 2002-07-11
  • 打赏
  • 举报
回复

前面是我搞错了,加了括号也不行,因为我查看的是目标文件。

测试程序:a.c

main(){
a:
goto a;
__asm__("jmp -1");
}
[root@m00 /tmp]# cc -c a.c
[root@m00 /tmp]# objdump -d a.o

a.o: file format elf32-i386

Disassembly of section .text:

00000000 <main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 90 nop
4: eb fe jmp 4 <main+0x4>
6: e9 fb ff ff ff jmp 6 <main+0x6>
b: c9 leave
c: c3 ret

这里是对的。
但是编译成a.out
[root@m00 /tmp]# cc a.c
[root@m00 /tmp]# objdump -d a.out
......
08048398 <main>:
8048398: 55 push %ebp
8048399: 89 e5 mov %esp,%ebp
804839b: 90 nop
804839c: eb fe jmp 804839c <main+0x4>
804839e: e9 5c 7c fb f7 jmp ffffffff <_end+0xf7fb6b0b>
80483a3: c9 leave
80483a4: c3 ret
......

这里就不对了,看来是重定位表惹的祸,如果没有用标号,连接的时候就认为是绝对地址。

eb和e9都是相对转移,不过一个8位,一个32位而已。很明显两个地方的jmp不一样,被改了。不过我现在还没有找到as里面控制重定位表的方法,as-info里面写得太含糊了。
CoolQ 2002-07-10
  • 打赏
  • 举报
回复
to zengpan_panpan:
可是我的gcc编译
__asm__("jmp 0x2a"); 或者__asm__("jmp (0x2a)");都是编译成
jmp 0x2a,我试了gcc 2.95和2.96都这个样。难道你的不是这样吗?
只有设为.byte 0xeb,0x2a才是相对跳转。真是很奇怪呀。
zengpan_panpan 2002-07-10
  • 打赏
  • 举报
回复
不要搞错了,jmp 0x2a是相对跳转,只不过相对于eip=0

ljmp 0x2a或者jmp *0x2a才叫绝对跳转。
zengpan_panpan 2002-07-10
  • 打赏
  • 举报
回复

__asm__("jmp 0x2a")
改成
__asm__("jmp (0x2a)")

你的gcc版本还不行,我就没有办法了。
zengpan_panpan 2002-07-10
  • 打赏
  • 举报
回复
a()
{
return 1;
}

b()
{
__asm__("call a");
}

是可以的啊,如果你再定义个叫a的标号就完蛋了。
cc -S 弄出来看一下就很清楚了啊。
CoolQ 2002-07-10
  • 打赏
  • 举报
回复
to zengpan_panpan:那如果我想相对call怎么办?也用标号?怎么用?
zengpan_panpan 2002-07-10
  • 打赏
  • 举报
回复
这是gcc的问题,又不允许jmp near ptr xxx 之类的做法,要不就只能用标号了。
__asm__("jmp here");
......
__asm__("here:");
CoolQ 2002-07-10
  • 打赏
  • 举报
回复
to zengpan_panpan:
难道就不能用jmp来实现吗?我想用jmp来实现。毕竟相对跳转不一定是-128-+127呀。而且我看资料应给是汇编成相对跳转。
cattiger 2002-07-10
  • 打赏
  • 举报
回复
关注
zengpan_panpan 2002-07-10
  • 打赏
  • 举报
回复
__asm__(".byte 0xeb
.byte 0x2a
");
gernal_dn 2002-07-10
  • 打赏
  • 举报
回复
用label

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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