在我看到ndisasm的函数之后汇编指令的目的是什么?

时间:2012-05-30 12:33:40

标签: assembly x86 nasm elf disassembly

我反汇编了编译非常简单的源文件test.c而得到的代码,如下所示:

void main() {}

我运行这些命令将main函数链接到一个静态可执行文件(编者注:没有CRT启动代码,所以它会崩溃),然后提取到一个平面二进制文件,删除了几个部分,所以我可以将其提供给ndisasm(编者注:不理解像objdump -drwC -Mintel这样的ELF元数据)

 gcc -c test.c 
 ld -o test -Ttext 0x0 -e main test.o 
 objcopy -R .note -R .comment -S -O binary test test.bin
 ndisasm -b 32 test.bin

这就是我得到的:

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  5D                pop ebp
00000004  C3                ret
00000005  0000              add [eax],al
00000007  001400            add [eax+eax],dl
0000000A  0000              add [eax],al
0000000C  0000              add [eax],al
0000000E  0000              add [eax],al
00000010  017A52            add [edx+0x52],edi
00000013  0001              add [ecx],al
00000015  7C08              jl 0x1f
00000017  011B              add [ebx],ebx
00000019  0C04              or al,0x4
0000001B  0488              add al,0x88
0000001D  0100              add [eax],eax
0000001F  001C00            add [eax+eax],bl
00000022  0000              add [eax],al
00000024  1C00              sbb al,0x0
00000026  0000              add [eax],al
00000028  D8FF              fdivr st7
0000002A  FF                db 0xff
0000002B  FF05    00000000      inc dword [dword 0x0]
00000031  41                inc ecx
00000032  0E                push cs
00000033  088502420D05      or [ebp+0x50d4202],al
00000039  41                inc ecx
0000003A  0C04              or al,0x4
0000003C  04C5              add al,0xc5
0000003E  0000              add [eax],al

前四行的所有目的是什么?为什么它会添加到eax指向的内存位置,2 * eax,edx + 0x52,比较等等?是关于检查程序是否正确执行或其他什么?

2 个答案:

答案 0 :(得分:11)

我相信你有一些不是代码的反汇编,这就是为什么它没有多大意义。

为了了解文件可能包含的内容,我建议在完整二进制文件(ELF)上运行objdump,以查看是否可以在任何文件中识别上述字节序列部分。

答案 1 :(得分:1)

此部分为.eh_frame,紧接.text之后。使用gcc进行编译时,您可以通过使用-fno-asynchronous-unwind-tables来摆脱它。

有关更多详细信息,请参见Why GCC compiled C program needs .eh_frame section?