【问题标题】:What does an object file 'do' and why is it required?目标文件“做什么”以及为什么需要它?
【发布时间】:2019-10-05 19:37:48
【问题描述】:

假设我有以下 asm 程序,exit.s:

.section .text
.globl _start
_start:
    movl $1, %eax
    movl $0, %ebx
    int $0x80

当我运行以下命令来构建目标文件时:

$ as exit.s -o exit.o

这究竟是做什么的,为什么需要这样做?摘自《从头开始编程》一书:

目标文件是机器语言中的代码,但尚未完全组合在一起。

我认为这就是汇编语言本身的全部意义所在?那么汇编程序(exit.s)和目标文件(exit.o)之间的区别是什么。不能同时被计算机读取,例如在第一行执行 hexdump:

0000000 2e 73 65 63 74 69 6f 6e 20 2e 74 65 78 74 0a   
000000f

为什么计算机不能直接理解?

【问题讨论】:

  • 啊,但是如果您有多个 asm 文件,请提供图片。可能是printing.s、inputting.s、fileopen.s 等。然后是main.s,它调用所有其他文件中的例程来做一些令人惊奇的事情。在某些时候,您需要将它们全部缝合在一起。您在 main.s 中使用的“调​​用打印”需要知道打印代码结束的地址。这就是链接器所做的。它获取所有目标文件,找出将所有内容放在内存中的位置,用实际地址替换符号,然后写出可执行文件。
  • 一个目标文件包含所有必要的指令,但不能运行。下一个编译步骤是将目标文件与程序所需的所有库链接。例如,如果您使用 printf,链接器将静态或动态链接指令。汇编语言由“助记符”和“操作数”组成。助记符是处理器制作的操作名称。例如, movl 是一个助记符,它告诉处理器将(立即)值(1)移动到 eax 注册表。问题是处理器不理解 movl 是什么意思,他只理解 0 和 1 的长逻辑序列。
  • @DavidWohlferd 你想在答案中展示一个例子,我可以继续接受吗?
  • @nissimabehcera 但是为什么不制造一台可以理解 MOVL 的计算机呢?这就是问题;)
  • 请注意,可以跳过目标文件步骤并让汇编程序直接生成可执行文件。但是,这使得编写库和大型程序变得很困难,因为每次使用时汇编器都必须重新组装整个库,从而消耗大量时间和内存。在这方面,链接器要快得多。

标签: assembly object-files


【解决方案1】:

这是在做什么

这就是将你的程序集(人类可读的文本)组装(翻译)成机器代码(机器可读的二进制文件)。

为什么需要这个

因为 CPU 不能执行文本,它们只能执行机器代码。

为什么计算机不能直接理解?

首先,第一行是给汇编器的指令而不是指令。这些行告诉汇编器如何 汇编,而不是什么 汇编。

其次,设计和构建一个执行文本汇编的 CPU 肯定是可能的,但它根本没有任何优势:更难设计,更难构建,执行程序更慢,程序可能是 3 倍,4 倍的大小当前机器码...如您所见,这种方式效率不高。

【讨论】:

  • 所以不是运行movl $1, %eax(或它的二进制表示),机器实际执行的代码示例是什么?
  • 您可以使用objdump --disassemble-all exit.o查看每条指令的二进制文件。
  • @TagC198 该指令编码为b8 01 00 00 00,其中b8 是操作码(操作码),01 00 00 00 是一个4 字节的立即操作数。请参阅 Intel 手册了解指令编码或 this site 了解概述。
  • 顺便说一句:在 1960 年代,有些计算机的机器代码被设计成人类可读的文本。对于这样的计算机,“机器代码”和“汇编程序”是相同的。
猜你喜欢
  • 2018-01-07
  • 2015-07-04
  • 1970-01-01
  • 2012-04-26
  • 2014-06-01
  • 2013-07-22
  • 2016-02-28
  • 1970-01-01
  • 2011-07-21
相关资源
最近更新 更多