程序集显示大量重复代码?
Assembly showing a lot of repeating code?
所以我正在研究一些二进制文件以汇编成 C++ 代码。这是一个项目。
当我反汇编二进制文件时,我得到了很多重复的汇编代码,我不确定它在做什么。几乎就像它只是指向下方。
0x0000000000000000 <+0>: push %rbp
0x0000000000000001 <+1>: mov %rsp,%rbp
0x0000000000000004 <+4>: lea 0x0(%rip),%rsi # 0xb <main+11>
0x000000000000000b <+11>: lea 0x0(%rip),%rdi # 0x12 <main+18>
0x0000000000000012 <+18>: callq 0x17 <main+23>
0x0000000000000017 <+23>: callq 0x1c <main+28>
0x000000000000001c <+28>: mov %eax,0x0(%rip) # 0x22 <main+34>
0x0000000000000022 <+34>: mov 0x0(%rip),%eax # 0x28 <main+40>
0x0000000000000028 <+40>: cmp [=10=]x1,%eax
0x000000000000002b <+43>: je 0x40 <main+64>
0x000000000000002d <+45>: lea 0x0(%rip),%rsi # 0x34 <main+52>
0x0000000000000034 <+52>: lea 0x0(%rip),%rdi # 0x3b <main+59>
0x000000000000003b <+59>: callq 0x40 <main+64>
0x0000000000000040 <+64>: mov 0x0(%rip),%eax # 0x46 <main+70>
0x0000000000000046 <+70>: cmp [=10=]x1,%eax
所以重复代码是“lea”和“callq”。根据我阅读它的方式,它只是指向下一行。例如,第一个 lea 以 #0xb 结束,这是它正下方的行,并且指向它下面的行,依此类推。谁能帮我看一下?
项目中至少有一百多行,所以我不是在寻找免费的A,我只是需要帮助理解。
编辑:我正在使用无法访问原始 .cpp 文件的 .o 文件,任务是使用 GDB 和 Bless 帮助我读取程序集输出并将其重新组装成一个 .cpp 文件与原代码相同
So the repeating code is the "lea" and "callq".
地址表明您正在反汇编 .o
文件,而不是可执行文件(您应该 始终 显示询问其输出时使用的命令)。
试试 objdump -dr foo.o
-- 图片应该会更清晰。
P.S。无论如何,GDB 并不是查看 .o
文件的正确工具。
更新:
I tried the objdump -dr Project1.o
and got pretty much the same output
仔细观察:不是相同的输出。 objdump
将显示重新定位,显示他 CALL
实际要去的地方。
您还应该能够 link Project1.o
进入可执行文件(类似于 gcc Project1.o -o Project1
),然后 运行 gdb Project1
然后 disas main
.您会看到 that 反汇编更有意义,并且也匹配 objdump
.
的输出
所以我正在研究一些二进制文件以汇编成 C++ 代码。这是一个项目。
当我反汇编二进制文件时,我得到了很多重复的汇编代码,我不确定它在做什么。几乎就像它只是指向下方。
0x0000000000000000 <+0>: push %rbp
0x0000000000000001 <+1>: mov %rsp,%rbp
0x0000000000000004 <+4>: lea 0x0(%rip),%rsi # 0xb <main+11>
0x000000000000000b <+11>: lea 0x0(%rip),%rdi # 0x12 <main+18>
0x0000000000000012 <+18>: callq 0x17 <main+23>
0x0000000000000017 <+23>: callq 0x1c <main+28>
0x000000000000001c <+28>: mov %eax,0x0(%rip) # 0x22 <main+34>
0x0000000000000022 <+34>: mov 0x0(%rip),%eax # 0x28 <main+40>
0x0000000000000028 <+40>: cmp [=10=]x1,%eax
0x000000000000002b <+43>: je 0x40 <main+64>
0x000000000000002d <+45>: lea 0x0(%rip),%rsi # 0x34 <main+52>
0x0000000000000034 <+52>: lea 0x0(%rip),%rdi # 0x3b <main+59>
0x000000000000003b <+59>: callq 0x40 <main+64>
0x0000000000000040 <+64>: mov 0x0(%rip),%eax # 0x46 <main+70>
0x0000000000000046 <+70>: cmp [=10=]x1,%eax
所以重复代码是“lea”和“callq”。根据我阅读它的方式,它只是指向下一行。例如,第一个 lea 以 #0xb
项目中至少有一百多行,所以我不是在寻找免费的A,我只是需要帮助理解。
编辑:我正在使用无法访问原始 .cpp 文件的 .o 文件,任务是使用 GDB 和 Bless 帮助我读取程序集输出并将其重新组装成一个 .cpp 文件与原代码相同
So the repeating code is the "lea" and "callq".
地址表明您正在反汇编 .o
文件,而不是可执行文件(您应该 始终 显示询问其输出时使用的命令)。
试试 objdump -dr foo.o
-- 图片应该会更清晰。
P.S。无论如何,GDB 并不是查看 .o
文件的正确工具。
更新:
I tried the
objdump -dr Project1.o
and got pretty much the same output
仔细观察:不是相同的输出。 objdump
将显示重新定位,显示他 CALL
实际要去的地方。
您还应该能够 link Project1.o
进入可执行文件(类似于 gcc Project1.o -o Project1
),然后 运行 gdb Project1
然后 disas main
.您会看到 that 反汇编更有意义,并且也匹配 objdump
.