11

我正在学习这门课程,但我真的很难理解指令的.align概念。
这是一个例子,我无法理解:

在此处输入图像描述

我知道在数据段里面,有地址,以0x10010000、0x10010020等开头。

而且我知道,在每个地址内部,有 8 个内存字段,每个都有 32 位。

现在,我不明白的是,var2地址 0x10010010 内部的方式和原因是什么?str1位于地址 0x10010003 内,因为我们为var1.

最后一件事是,指令到底在.align做什么?当我在Mars4中测试它时,它只是在我使用和向上时将数据转移到下一个内存字段align 3,但我并没有真正理解它。

4

3 回答 3

15

对齐对于 MIPS 处理器很重要,它只喜欢从内存中的数据大小倍数的地址读取多字节值。

.ASCIIZ 字段可以放在任何地方,因为一次读取一个字节的字符串。所以把它放在 0x10010003 就可以了。

.WORD 字段必须与 4 的倍数对齐。所以它不能放在 0x1001000E,即字符串之后的下一个可用位置。汇编器有意移动该值并留下两个未使用的字节。到下一个地址是 4 的倍数,0x10010010。

.ALIGN 指令是一种覆盖默认对齐规则的方法。指令之后的下一个字段将对齐到 2 的 n 次幂的倍数,其中 n 是 .ALIGN 值。在您的情况下,这是 pow(2, 3) = 8 个字节。

这就是您看到的情况,如果没有 .ALIGN 指令,.HALF 字段将存储在 0x10010014。不是 8 的倍数,所以它被移动到 0x10010018。

该示例是人为的,没有明显的理由在此处使用 .ALIGN 指令,因为 .HALF 只需要与 2 的倍数对齐,因此将其存储在 0x10010014 就可以了。

于 2013-10-26T16:27:13.700 回答
3

某些汇编指令暗示数据是对齐存储的,这意味着从一个 2 的幂的地址开始。首先回忆一下 MIPS 中的几个约定: 

(1) 一个“字”是 4 个字节(有时你会看到它被定义为 2 个字节),

(2) 半字 (.half) 是 2 个字节,并且

(3) .asciiz null 终止字符串(如在 C 中)。

使用它,您已经解释了如何存储 var1 和 str1。为什么 var2 之前有 2 个空字节的缓冲区?因为它被声明为.word,并且(由上面的(1))将存储在4的倍数的内存位置开始。如果你声明它是.half,你在str1之间没有2个空字节和 var2。

var2 被声明为 .half - 它是一个 16 位(2 字节)地址,适合一个。但是,在声明它之前,对齐已更改为 3。现在,检查第一句话:这是您将 2 提高到的;所以我们实际上对齐到 8。这意味着在被覆盖之前,变量将按声明放置,但另外它们的初始存储位置必须是 8 的倍数。因此,汇编器插入 4 个空字节以将 var3 存储为 8 的倍数。 

于 2013-10-26T16:42:06.100 回答
0

而且我知道,在每个地址内部,有 8 个内存字段,每个都有 32 位。

MIPS 内存不是可字节寻址的吗?这意味着每个内存地址引用一个 8 位数量

于 2022-01-27T22:43:08.603 回答