【发布时间】:2017-01-07 23:42:03
【问题描述】:
BOOL32 doStuff() {
return TRUE;
}
gcc 2.95 for vxworks 5.x,用-O0为32位x86编译上述代码生成以下代码:
doStuff:
0e9de190: push %ebp
0e9de191: mov %esp,%ebp
308 return TRUE;
0e9de193: mov $0x1,%eax
0e9de198: jmp 0xe9de1a0 <doStuff+16>
312 {
0e9de19a: lea 0x0(%esi),%esi
// The JMP jumps here
0e9de1a0: mov %ebp,%esp
0e9de1a2: pop %ebp
0e9de1a3: ret
在 JMP 和 LEA 指令之前,一切看起来都很正常。它们是干什么用的?
我的猜测是它是某种对齐方式,但我不确定。
我会做这样的事情:
doStuff:
0e9de190: push %ebp
0e9de191: mov %esp,%ebp
308 return TRUE;
0e9de193: mov $0x1,%eax
0e9de1XX: mov %ebp,%esp
0e9de1XX: pop %ebp
0e9de1XX: ret
0e9de1XX: fill with lea 0x0, %esi
【问题讨论】:
-
您编写的哪些代码最终被翻译成上面生成的程序集?您应该包含此信息以增加获得帮助的机会。
-
你编译优化了吗?什么平台/操作系统?
-
添加信息希望对您有所帮助
-
查看在
-O0编译的代码完全是浪费时间。编译器不仅不关心生成最优代码,它有时会生成病态次优代码以使调试更容易(例如,允许你设置断点)。您应该查看的唯一反汇编是优化代码。
标签: gcc assembly x86 reverse-engineering