我对运行时间有什么兴趣,所以我写了一个简单的c程序,如下所示。(我不会粘贴some_function的代码。我认为这并不重要。)
int main(int argc, char *argv[]) {
some_fucntion();
return;
}
我在我的Mac(10.6.8,Intel Core)上使用i686-apple-darwin10-llvm-gcc-4.2并使用以下命令编译源代码。实际上我已经尝试使用O3并获得相同的结果。
gcc -O0 -o test test.c
然后我输入以下命令并获取那些asm代码。
otool -tV test
我得到以下asm代码。我猜这些代码与准备main函数的参数有关。但我仍然无法弄清楚为什么有一个循环将eax设置为0x00?为什么有“jmp”指令?所以下一条指令永远不会被执行,对吧?
如果有人能在这里解释整个asm代码,我将非常感激。感谢。
start:
0000000100000d20 pushq $0x00
0000000100000d22 movq %rsp,%rbp
0000000100000d25 andq $0xf0,%rsp
0000000100000d29 movq 0x08(%rbp),%rdi
0000000100000d2d leaq 0x10(%rbp),%rsi
0000000100000d31 movl %edi,%edx
0000000100000d33 addl $0x01,%edx
0000000100000d36 shll $0x03,%edx
0000000100000d39 addq %rsi,%rdx
0000000100000d3c movq %rdx,%rcx
0000000100000d3f jmp 0x100000d45
0000000100000d41 addq $0x08,%rcx
0000000100000d45 cmpq $0x00,(%rcx)
0000000100000d49 jne 0x100000d41
0000000100000d4b addq $0x08,%rcx
0000000100000d4f callq _main
0000000100000d54 movl %eax,%edi
0000000100000d56 callq 0x100000e7c ; symbol stub for: _exit
0000000100000d5b hlt
0000000100000d5c nop
答案 0 :(得分:5)
start:
0000000100000d20 pushq $0x00 ; push NULL (end of dynamic frame pointer chain)
0000000100000d22 movq %rsp,%rbp ; set frame pointer
0000000100000d25 andq $0xf0,%rsp ; align stack
0000000100000d29 movq 0x08(%rbp),%rdi ; mov argc to 1st arg
0000000100000d2d leaq 0x10(%rbp),%rsi ; mov argv to 2nd arg
0000000100000d31 movl %edi,%edx ; \
0000000100000d33 addl $0x01,%edx ; > 3rd arg = argv + (argc + 1) * 8
0000000100000d36 shll $0x03,%edx ; > = envp
0000000100000d39 addq %rsi,%rdx ; /
0000000100000d3c movq %rdx,%rcx ; \
0000000100000d3f jmp 0x100000d45 ; >
0000000100000d41 addq $0x08,%rcx ; > find 1st NULL after envp and
0000000100000d45 cmpq $0x00,(%rcx) ; > move to 4th arg
0000000100000d49 jne 0x100000d41 ; /
0000000100000d4b addq $0x08,%rcx ; and add 8 (apple)
0000000100000d4f callq _main ; call main
0000000100000d54 movl %eax,%edi ; move return value to 1st arg
0000000100000d56 callq 0x100000e7c ; and call _exit (doesn't return)
0000000100000d5b hlt
0000000100000d5c nop
apple
是Apple特定的参数,包含可执行文件的路径(source)。