【发布时间】: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