【发布时间】:2018-07-22 02:30:27
【问题描述】:
有人可以解释为什么这个代码:
#include <stdio.h>
int main()
{
return 0;
}
当使用 tcc 编译时,使用 tcc code.c 会产生这个 asm:
00401000 |. 55 PUSH EBP
00401001 |. 89E5 MOV EBP,ESP
00401003 |. 81EC 00000000 SUB ESP,0
00401009 |. 90 NOP
0040100A |. B8 00000000 MOV EAX,0
0040100F |. E9 00000000 JMP fmt_vuln1.00401014
00401014 |. C9 LEAVE
00401015 |. C3 RETN
我猜是的
00401009 |. 90 NOP
也许有一些内存对齐,但是呢
0040100F |. E9 00000000 JMP fmt_vuln1.00401014
00401014 |. C9 LEAVE
我的意思是为什么编译器会插入这个跳转到 next 指令的近跳转,LEAVE 无论如何都会执行?
我在 64 位 Windows 上使用 TCC 0.9.26 生成 32 位可执行文件。
【问题讨论】:
-
其实是优化的反面,因为你没有开启它。编辑:显然你不能用
tcc控制优化。啊。好吧,它应该很小,不会生成高效的代码:) -
TCC 不(也不应该)用于高度优化的建筑。它没有做太多优化。
-
小而快的是 tcc,而不是它生成的代码。 Tcc 非常适合编译不会执行足够多次的东西,因此值得花时间生成好的代码。
-
@MichaelPetch v0.9.26
-
main() 通常不是你应该检查这种事情的函数,因为编译器可以/将寻找它并添加额外的东西。对于这些测试,请使用其他一些非标准名称,例如 test 或 fun 或 foo 或 bar。而且 tcc 不是一个真正查看输出的编译器,除了它的功能性之外,它不是高效的。
标签: c assembly x86 compiler-optimization tcc