转储以下C程序:
int main() {
int i,j;
for(i=0; i<2; i++) {
j++;
}
return 0;
}
正在制作:
08048394 <main>:
int main() {
8048394: 8d 4c 24 04 lea 0x4(%esp),%ecx
8048398: 83 e4 f0 and $0xfffffff0,%esp
804839b: ff 71 fc pushl -0x4(%ecx)
804839e: 55 push %ebp
804839f: 89 e5 mov %esp,%ebp
80483a1: 51 push %ecx
80483a2: 83 ec 10 sub $0x10,%esp
int i,j;
for(i=0; i<2; i++) {
80483a5: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%ebp)
80483ac: eb 08 jmp 80483b6 <main+0x22>
j++;
80483ae: 83 45 f4 01 addl $0x1,-0xc(%ebp)
int main() {
int i,j;
for(i=0; i<2; i++) {
80483b2: 83 45 f8 01 addl $0x1,-0x8(%ebp)
80483b6: 83 7d f8 01 cmpl $0x1,-0x8(%ebp)
80483ba: 7e f2 jle 80483ae <main+0x1a>
j++;
}
return 0;
80483bc: b8 00 00 00 00 mov $0x0,%eax
}
无论我放i<2
还是i<10
,我都会看到两个main()
具有相同的结构。有人能告诉我为什么会这样吗?
答案 0 :(得分:2)
您没有看到两个main()
。你看到一个反汇编程序被for
循环完全混淆了。实际的程序集,如果你一直读到它,只代表一个函数main()
,逻辑路径与C代码相同。
简而言之:交错进入程序集的C 错误。
答案 1 :(得分:2)
反汇编程序正如编译器的输出调试信息所说的那样尽职尽责地交错源代码。在Linux上,您可以使用objdump -W
:
… Line Number Statements: Extended opcode 2: set Address to 0x80483e4 Copy Special opcode 91: advance Address by 6 to 0x80483ea and Line by 2 to 3 Special opcode 132: advance Address by 9 to 0x80483f3 and Line by 1 to 4 Special opcode 60: advance Address by 4 to 0x80483f7 and Line by -1 to 3 Special opcode 148: advance Address by 10 to 0x8048401 and Line by 3 to 6 Special opcode 76: advance Address by 5 to 0x8048406 and Line by 1 to 7 Advance PC by 2 to 0x8048408 Extended opcode 1: End of Sequence …
我的编译器显然与你的有点不同,因为地址不同,但你看它是如何工作的:输出组件中的地址与输入源文件中的行之间的映射是不精确的。