汇编程序如何在硬件级别工作



我一直在网上阅读关于汇编程序的工作,但它很令人困惑。总的来说,到目前为止我所理解的是,汇编程序基本上是一个文本解析器,它可以访问一个查找表,将汇编语言指令映射到等效的二进制指令。我说得对吗?如果我是,这个查找表在CPU的物理硬件中存在于哪里。

CPU执行机器代码(一堆数字)。这些数字通常以某种方式排列,(为了使CPU更容易解码)涉及整体格式的各种规则,哪些部分决定操作码,哪些部分确定指令的操作数,等等

汇编语言大部分(不完全——见下文)是"汇编语言";纯文本";机器代码的表示。CPU使用的所有规则(用于机器代码)都成为汇编程序使用的规则。例如,如果描述某些指令的机器代码的CPU的文档说";位4至7确定哪个寄存器用于第一个操作数"0";那么汇编程序可能具有一个函数(或者可能是一个表)来将寄存器名称转换为位4到7的正确值。指令组(将指令的助记符转换为任意多个操作码字节的函数或表)也会发生类似的情况。

所有用于将文本转换为机器代码的东西(函数、表等)都是由编写汇编程序的人创建的(以遵守CPU关于如何将所有内容编码为机器代码)。这些都不是来自CPU本身;并且大多数汇编程序将在完全不同的CPU上运行(例如,大多数80x86汇编程序可以很容易地移植到ARM或PowerPC或MIP或..上运行)

除此之外,汇编程序还必须提供有用的错误检查和报告(这样,如果汇编语言源代码中有错误,程序员就很容易找出哪里出了问题——例如,使用带有行号的漂亮/描述性错误消息等);加上对预处理(宏等)的支持;加上对各种输出文件格式的支持(适合不同链接器的对象文件、诸如"平面二进制"之类的原始输出文件类型等);和指令(控制预期的CPU模式、对准等),以及程序员描述";不是代码的数据";。

所有这些其他东西也是由编写汇编程序的人创建的。

首先,有一个指令集体系结构(ISA)——这是一个以文本形式发布的规范,通常由CPU供应商发布。本文档规定了可供程序使用和处理器实现的每一条机器代码指令。ISA规范涉及软件和硬件之间的基本边界;到软件程序员和硬件实现者之间的基本协议(或思想交汇)。

为了方便起见,ISA规范还可以包括";优选的";或每个机器代码指令的建议组装形式。

汇编程序是由使用ISA规范的人编写的程序,用于将汇编代码转换为机器代码。它们用来完成翻译的机制包含在汇编程序的程序代码中,可能涉及具有模式匹配的表,也可能使用普通编程(例如if-then语句)来完成,所有这些都由ISA规范通知。没有一种正确的方法来设计汇编程序。

翻译(汇编)完全由汇编程序控制(无需咨询硬件)——例如,考虑我们可以在Windows x64上运行一个接受并生成ARM Linux代码的汇编程序——引用了两个非常不同的处理器:一个实际运行汇编程序,另一个是汇编机器代码的预期目标。因此,运行汇编程序的处理器和生成的机器代码之间没有直接关系。

同一ISA可以有多个汇编程序。特定汇编程序的作者将发布其汇编语言的规范,该规范展示了如何使用汇编助记符和其他语法(如寻址模式、标签等)来指定和完成ISA的机器代码指令

硬件也是由使用此ISA规范来实现机器代码指令及其所有变体的人员编写的。可能有表格,也可能有微码(有些人可能认为这是描述完成指令的操作的查找"表格")。与汇编程序一样,有许多可能的方法,但没有一种正确的方法来实现指令集。

因此,软件和硬件的基础是指令集体系结构中的一致性。软件程序员接受硬件将实现此规范,硬件程序员接受软件将使用此规范。

最新更新