首页 >> 民生娱乐

程序的机器级表示牛

民生娱乐  2021-08-24 13:29 字号: 大 中 小

使用gcc,可以参考gcc手册。

我们在这里就简单介绍一下我们需要的一些选项。

我们先看看一个源代码文件,是经过那些步骤变成可执行文件的:

-----------

源代码文件

*.c *.h

-----------

-----------

预处理器[-E]

-----------

-----------

编译器[-c]

-----------

-----------

目标代码

*.o

-----------

-----------

链接器

-----------

-----------

可执行文件

-----------

我们来一步一步完成这个过程:

还拿asm01.c做示范吧

1我们首先可以得到预处理后的文件:gcc -E asm01.c -o p

////////////////////// CPP CODE ////////////////////////

// filename: asm01.c

# 1 \"asm01.c\"

# 1 \"built-in\"

# 1 \"command line\"

# 1 \"asm01.c\"

int test(int a)

{

int b=a;

return b;

}

2然后我们看看编译后的文件,首先可以让他在汇编完成后停下来:gcc -x cpp-output -S p -o asm01.s

///////////////// ASM CODE /////////////////////

//file name: asm01.s

.file\"asm01.c\"

.text

.p2align 4,,15

.globl _test

.def_test;.scl2;.type32;.endef

_test:

pushl%ebp

movl%esp, %ebp

movl8(%ebp), %eax

popl%ebp

ret

/*********************************************************************\\

PS:解释一下-x选项,我在google上找了半天才找到一个中文的解释:)

-x language

明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).这个选项应用于后面 所有的输入文件,直到遇着下一个`-x\'选项. language的可选值有`c\', `objective-c\', `c-header\', `c++\', `cpp-output\', `assembler\',和`assembler-with-cpp\'.

-x none

关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过`-x\'选项).

如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x\'选项(或文件名后缀)告诉 gcc从哪里开始,用`-c\', `-S\',或`-E\'选项告诉gcc到 哪里结束.注意,某些选项组合(例如, `-x cpp-output -E\')使gcc不作任何事情.

\\**********************************************************************/

3下面是到目标代码:gcc -x assembler -c asm01.s -o asm01.o

要想看这个二进制文件的内容,我们需要使用一个反汇编器.dev-cpp有一个叫做objdump的程序,我们可以使用带-d(Disassembly)选项来得到这个二进制文件的机器码表示及汇编码对照。

////////////// THE CONSOLE OUTPUT /////////////////////////

//

D:\\projectobjdump -d asm01.o

asm01.o: file format pe-i386

Disassembly of section .text:

_test:

0: 55 push %ebp

此外 1: 89 e5 mov %esp,%ebp

3: 83 ec 04 sub $0x4,%esp

6: 8b 45 08 mov 0x8(%ebp),%eax

9: 89 45 fc mov %eax,0xfffffffc(%ebp)

c: 8b 45 fc mov 0xfffffffc(%ebp),%eax

f: c9 leave

10: c3 ret

4最后就是链接了:gcc asm01.o -o e

想要分析这个.exe程序,我们就需要反汇编程序了。我们并不把视线放到这里来,而且我们的e也没有程序入口点。

PS:[]其实这个过程我们可以使用相应的应用程序来完成。

使用cpp来将.c文件翻译成.i文件,它只是进行预编译操作。完成头文件include、宏替换、过滤注释等操作。

使用ccl进行编译成.s文件

使用as编译成.o文件

使用ld链接成可执行文件

长沙哪家医院妇科医院好
南宁前列腺炎治疗费用
济南盆腔炎
推荐资讯