MIPS 汇编/MIPS 指令
汇编语言程序有一些共同的特征。这些是
- 标签
- 节
- 指令
- 注释
- 命令
在 MIPS 汇编中,注释用 井号 ("#") 表示。井号之后的同一行上的所有内容都是注释,会被汇编器的词法分析器跳过。
标签 是为了让你的生活更简单。当你引用你的程序的一部分时,你不需要数行,你只需要给它起一个名字。你可以在循环、跳转和变量名中使用它。
标签不会出现在你的最终代码中,它们只是为了方便,这是你从典型的 MIPS 汇编器得到的少数好处之一。它也让汇编器的工作变得简单,因为它现在可以轻松地重新定位和链接代码。如果你不知道这些是什么,不用担心,后面会讲到。
MIPS 汇编中的标签,实际上在大多数 ASM 变体中也是如此,是通过编写以下内容创建的
name:
其中 name 是你用来引用这个标签的名称。注意,你不能用与 MIPS 指令相同的名称创建标签。
标签与它们的 C 表兄弟相同,是 goto 运算符的目标。
节 是一种将汇编语言程序逻辑地划分为指令和数据的方式。由于你的汇编程序被加载到内存中,处理器只需要知道执行的开始位置(称为入口点),然后仅仅增加指令指针,然后继续执行。如果数据在内存中的指令代码中交织,处理器需要知道什么是数据,什么是指令 - 这对于一个更复杂的处理器来说是很有用的。为了简单起见,数据被放置在一个与指令不同的区域。节就是为了这个目的而使用的。
在 MIPS 编程中,你需要注意两个节:文本节和数据节。文本节包含你的汇编程序,数据节包含你的数据。用以下方法指定文本节的开始.text以及数据节的开始.data.
处理器汇编器(或你的模拟器)理解一些特殊的命令,这些命令执行特定的任务,使你的生活更轻松:例如,为你创建内存空间,以便在变量中存储数据。
如果你想在你的汇编程序中为一个数字创建一个变量,你可能想要
- 切换到数据节
- 创建一个标签来为你的变量创建一个内存引用
- 给它一个合适的名称
- 为它分配一些内存
- 在内存中正确地对齐它。
- 切换回文本节
根据我们所学到的知识,我们可以写出到步骤 3 的 MIPS 汇编代码
.data
variable_name:
但是现在我们如何分配一些内存呢?我们使用.space指令。通常情况下,一个整数占用 4 个字节,所以我们写
.data
variable_name:
.space 4
我们现在需要在内存中对齐 数据(我们将在下面解释),所以我们使用.align指令
.data
variable_name:
.space 4
.align 2
.text
我们已经切换回了文本节。
MIPS 汇编器中的内存位置需要对齐 - 也就是说,内存位置必须从正确的位置开始,否则处理器会崩溃。4 字节整数必须每 4 字节对齐,依此类推。该.align n指令将数据对齐到适合 2n 字节的内存单元。因此,对于 32 位(4 字节)整数,我们使用.align 2对于 22 或 4 字节。将下一个变量或指令对齐到一个字节上,该字节是该数字的倍数。为了对齐分配的空间,'align n' 应该在 'space x' 声明之前。例如,以下是一个在内存中分配 6 个字(6 x 4 = 24 字节)并在字边界上对齐它们的示例
.data
.align 2
my_var_name:
.space 24