我正在运行一些测试,以查看++i和i++如何转换为汇编语言。我编写了一个简单的for循环:
int main()
{
int i;
for(i=0;i<1000000;++i);
return 0;
}
使用gcc test.c -O0 -o test编译代码,并使用objdump -d test命令检查汇编代码:
4004ed: 48 89 e5 mov %rsp,%rbp
4004f0: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) // i=0;
4004f7: eb 04 jmp 4004fd <main+0x11>
4004f9: 83 45 fc 01 addl $0x1,-0x4(%rbp) // ++i;
4004fd: 81 7d fc 3f 42 0f 00 cmpl $0xf423f,-0x4(%rbp) //
400504: 7e f3 jle 4004f9 <main+0xd> //i<1000000;
400506: b8 00 00 00 00 mov $0x0,%eax
40050b: 5d pop %rbp
40050c: c3 retq
目前为止一切都很好。不过有个奇怪的事情(如果我理解汇编代码正确的话),当我把i < 1000000改成了i < 10000000000时。停止条件为i < 10000000000的完全相同的for循环被翻译为以下汇编代码:
4004ed: 48 89 e5 mov %rsp,%rbp
4004f0: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
4004f7: 83 45 fc 01 addl $0x1,-0x4(%rbp)
4004fb: eb fa jmp 4004f7 <main+0xb>
根据我的理解,这是一个无限循环,因为完全相同的汇编代码被生成:
for(i=0;;++i);
问题是,它是否真的可能编译成无限循环?为什么? 我正在使用Ubuntu 13.04,x86_64。
谢谢。
i
能否容纳10000000000
? - hacckslong long int
。并检查limits.h
以了解整数类型的大小。 - pzaengeri++
和++i
生成完全相同的代码。 - SLaks