1 / 26
文档名称:

C编译器.pdf

格式:pdf   大小:225KB   页数:26页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C编译器.pdf

上传人:iris028 2022/7/24 文件大小:225 KB

下载得到文件列表

C编译器.pdf

相关文档

文档介绍

文档介绍:: .
Making plain binary f
我们刚才看到的代码紧紧建立了一个函数的基本框架。保存寄存器 ebp 为将来在处理函数参数
时使用。如你所发现的,代码是 32 位的,这是因为 GNU GCC 只能生成 32 位的代码。因此,如果
你要运行这个代码,你首先需要搭建一个 32 位的运行环境,如 linux。另外运行这个代码之前
你还需进入保护模式。
你还可以直接使用 ld 创建二进制文件,可以按如下方法编译 文件:
gcc –c
ld –o –Ttext 0x0 –e main –oformat binary
这将建立同上面看到的一模一样的二进制代码。
3,使用局部变量编程
Next we will take a look on how GCC handles the reservation of a local variable.
Here fore we
下面我们看看 GCC 是如何为局部变量预留空间的。这里我们将建立一个包含如下内容的
文件:
int main () {
int i; /* declaration of an int */
i = 0x12345678; /* hexadecimal */
}
用如下命令编译这个文件:
gcc –c
ld –o test –Ttext 0x0 –e main
objcopy –R .note –R .comment –S –O binary test
当我们编译完后就获得了如下内容的二进制文件:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 83EC04 sub esp,byte +0x4
00000006 C745FC78563412 mov dword [ebp-0x4],0x12345678
0000000D C9 leave
0000000E C3 解剖
现在得到的二进制文件中的头两个和末尾两个指令,同先前例子中的完全相同。在这两部分之
间加入了 2 个新的指令。第一个是将 esp 减少 4,这是 GCC 为一个 int 类型预留空间的方法,因
为在堆栈中 int 类型占了 4 个字节。下一个指令告诉了我们对于 ebp 寄存器的使用。这个寄存器
在函数中是保持不变的,被用来查找堆栈中的局部变量。这些局部变量被保存在称之为 local
stack frame 的地方。在这里的上下文中 ebp 寄存器被称为 frame 指针(frame pionter)。
接下来的指令将堆栈顶部的整型变量设置为数值0x12345678。注意到处理器是采用反序来存储
变量的,所以我们在对应的第二列看到的是78563412。这种现象被成为“倒序存储”(参见
Intel Architecture Software Developer’s Manual, Volume 1: Basic Architecture, .
Bit and Byte Order)。注意你也可以按照前面提到的方法直接建立二进制文件,如下:
gcc -c
ld -o -Ttext 0x0 -e main -oformat binary
这将产生同样的二进制代码。
直接赋