下载此文档

C编译器.pdf


文档分类:IT计算机 | 页数:约26页 举报非法文档有奖
1/26
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/26 下载此文档
文档列表 文档介绍
: .
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
这将产生同样的二进制代码。
直接赋

C编译器 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数26
  • 收藏数0 收藏
  • 顶次数0
  • 上传人iris028
  • 文件大小225 KB
  • 时间2022-07-24