compiler-construction - 8086 汇编器 - 从操作码生成目标代码

标签 compiler-construction x86 assembly

我正在为 8086 开发一个汇编程序。我的问题是如何将十六进制操作码转换为可执行文件,如 .EXE、.ELF、.COM、a.out 等。为此寻找链接/资源,汇编程序应该执行链接过程还是由操作系统自动?

最佳答案

相当复杂,通常涉及两个步骤:

  • 汇编程序读入汇编代码,计算出相应的机器代码,并将其连同其他一些信息一起写入目标文件,这些信息因您使用的目标文件格式而异
  • 链接器获取一组目标文件并将它们合并成一个可以实际运行的可执行文件

因此汇编器一般不会输出可执行文件;您需要选择一种目标文件格式并阅读如何生成它。理论上,只要您以给定格式输出一个有效的目标文件,任何链接器都应该能够执行实际的链接过程,但通常汇编器和链接器是一组来的,所以我不确定它实际上有多好在实践中工作(例如,GNU 汇编器(gas)输出 GNU 特定的重定位和 GNU 链接器(ld)知道如何处理的部分,因此您不能在任何其他链接器中使用 gas 生成的目标文件)

ELF 记录在 SV ABI 的第 4 节中。 ,尽管您也需要阅读处理器的附录。 COFF 被记录为 PE 规范的一部分,尽管我无法在 Internet 上的任何地方找到它;如果你需要,我可以把它贴在某个地方

关于compiler-construction - 8086 汇编器 - 从操作码生成目标代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3434786/

相关文章:

c++ - clflush 不刷新指令缓存

c - 将数组传递给外部汇编函数

assembly - 在用户模式下,x86 CPU可以读取任何寄存器的值吗?

c++ - 从<iostream.h> 更改为<iostream> 会导致缓冲区溢出吗?

c++ - DLL 和编译器设置

linux - Linux 上的 actionscript 3 编译器?

compiler-construction - 语法与语义分析

c - 操作系统的核心(设备抽象级别)是否完全用 C 编写? (比如 : "UNIX is written in C")

c++ - 原生显卡功能

assembly - 如何在中断服务程序中将寄存器保存在x86_64上?