社区
系统维护与使用区
帖子详情
高分求救:有关内嵌汇编!!急!!!
CoolQ
2002-07-10 05:12:41
我在C语言中使用内嵌汇编
__asm__
("
jmp 0x2a
")
其中的jmp 0x2a到底是绝对跳转还是相对跳转?我想应该是相对跳转,可是反汇编后却是绝对跳转。我该如何用jmp实现相对跳转呢?我的环境是linux7.2 + gcc2.96 + gdb5.0,希望大家指点!不够分再给!!!
...全文
45
11
打赏
收藏
高分求救:有关内嵌汇编!!急!!!
我在C语言中使用内嵌汇编 __asm__ (" jmp 0x2a ") 其中的jmp 0x2a到底是绝对跳转还是相对跳转?我想应该是相对跳转,可是反汇编后却是绝对跳转。我该如何用jmp实现相对跳转呢?我的环境是linux7.2 + gcc2.96 + gdb5.0,希望大家指点!不够分再给!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
工程伦理期末考通关秘籍:清华大学李正风教授课程重点解析(附主观题答题模板)
本文聚焦清华大学李正风教授《工程伦理》课程期末备考,系统解析工程风险的系统性本质、核电伦理中公正原则的公平与正当双重维度,并提出主观题“四段论”黄金结构(破题定义—核心论证—辩证深化—总结升华)。强调概念辨析(如责任/问责、安全/风险、效率/公正)及多目标平衡策略,突出工程伦理作为价值敏感性设计的思维范式。
易语言实现毛玻璃效果:从GDI+调用到高斯模糊算法实战
本文详解在易语言中通过GDI+调用与自研高斯模糊算法实现毛玻璃效果的全过程。核心包括:利用GDI+获取窗口背景位图、分离式一维高斯模糊优化算法、像素级RGBA数据操作、明度混合提升可读性,以及双缓冲绘制防闪烁。重点涵盖GDI+ API声明、内存位图锁定位操作、边界处理、Stride对齐、Alpha预乘校正等关键技术点,适用于Windows平台无边框现代UI开发。
ARM的系统追踪宏单元(STM,System Trace Macrocell)是什么?
系统追踪宏单元(STM)是ARM CoreSight架构中的关键调试组件,用于在不干扰系统运行的情况下,捕获软件生成的事件并附加高精度时间戳。它解决了传统调试方法如断点和printf带来的性能干扰问题,适用于实时系统、多核调试与性能分析。
厉害了!用6个芯片打造复古经典计算机
开发者MattSarnoff仅用6个芯片成功组装了一台8位家用计算机Amethyst,包含ATMEGA1284P CPU、USB接口芯片及4个简单集成电路,能生成NTSC视频输出、单声道音频,支持Forth编程语言,提供图像和声音指令、调试器和屏幕编辑功能。
航天器星载软件C模块防护失效实录(某遥感卫星在轨异常溯源):1行未加volatile的寄存器访问引发的链式故障
本文以某遥感卫星在轨异常为案例,深入剖析因一行未加volatile修饰的寄存器访问引发的链式故障,涵盖失效传播路径及修复验证。系统阐述volatile、const、restrict等C语言防护机制在航天嵌入式环境中的语义本质与时序建模,并介绍内存屏障、编译器优化裁剪、静态分析(MISRA C/PC-lint/Astrée)、硬件在环测试、运行时监控代理(RAMA)及故障注入(FIT)等关键技术,支撑GJB 8114-2013合规落地。
系统维护与使用区
19,614
社区成员
74,562
社区内容
发帖
与我相关
我的任务
系统维护与使用区
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
复制链接
扫一扫
分享
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章