gcc - 在 32 位机器上编译的汇编代码与使用 "gcc -m32"编译的代码不同吗?

标签 gcc x86-64 cpu-architecture disassembly objdump

我现在正在学习汇编语言。我正在学习的书中的代码示例都是在x86 32位机器(我认为)上用gcc编译的。为了将我的输出与书中的输出相匹配,我使用“gcc -m32”编译了简单的 helloworld.c。

#include <stdio.h>

int main(){
    int i;
    for(i=0;i<10;i++){
      printf("Hello World!\n");
    }
    return 0;
}

运行“objdump -D a32.out | grep -A20 main.:”得到的输出如下所示:

0000051d <main>:
51d:    8d 4c 24 04             lea    0x4(%esp),%ecx
521:    83 e4 f0                and    $0xfffffff0,%esp
524:    ff 71 fc                pushl  -0x4(%ecx)
527:    55                      push   %ebp
528:    89 e5                   mov    %esp,%ebp
52a:    53                      push   %ebx
52b:    51                      push   %ecx
52c:    83 ec 10                sub    $0x10,%esp
52f:    e8 ec fe ff ff          call   420 <__x86.get_pc_thunk.bx>
534:    81 c3 cc 1a 00 00       add    $0x1acc,%ebx
53a:    c7 45 f4 00 00 00 00    movl   $0x0,-0xc(%ebp)
541:    eb 16                   jmp    559 <main+0x3c>
543:    83 ec 0c                sub    $0xc,%esp
546:    8d 83 f0 e5 ff ff       lea    -0x1a10(%ebx),%eax
54c:    50                      push   %eax
54d:    e8 5e fe ff ff          call   3b0 <puts@plt>
552:    83 c4 10                add    $0x10,%esp
555:    83 45 f4 01             addl   $0x1,-0xc(%ebp)
559:    83 7d f4 09             cmpl   $0x9,-0xc(%ebp)
55d:    7e e4                   jle    543 <main+0x26>

但在书中它看起来像这样:enter image description here

它错过了我得到的输出中的前三行,并且除了接下来的两行之外,看起来没有任何相似之处。这是为什么 ?我如何更改编译器/反汇编设置以使其看起来相似?

最佳答案

默认情况下,您的编译器配置为生成位置无关的二进制文件,这会导致与本书的显着差异。 (这是 GCC 最近的发展)。

如果禁用此功能,您将更接近这本书:

gcc -fno-pie -no-pie -m32 hello.c

正如其他人所说,除非您获得以完全相同的配置构建的完全相同的编译器,否则不能保证您将获得与书中内容相同的代码。

关于gcc - 在 32 位机器上编译的汇编代码与使用 "gcc -m32"编译的代码不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47661934/

相关文章:

linux - gcc-4.7 与 Debian 8 杰西

c++ - 为什么编译器不对此进行优化?

c - 如何创建宏字符串

c - 将动态大小的可变长度数组 (VLA) 初始化为 0

c - 编写低级代码时是否有正确的方法来衡量性能?

assembly - 为什么x86丑?为什么比别人差?

c - 为什么一个内核执行的指令多于它所占的指令份额?

caching - 为什么现代处理器中的集合缓存关联性是 8 路集合关联性?

Linux 程序集 : how to call syscall?

assembly - MIPS 和 ARM 数据路径之间的区别