2013-10-26 122 views
5

我正在参加这个课程,并且我非常努力地理解指令.align的概念。了解装配MIPS .ALIGN和内存寻址

下面是一个例子,这是我无法理解:

enter image description here

我知道数据段里面,有地址,从0x10010000,0x10010020等。

而且我知道,每个地址里面有8个存储区,每个存储区有32位。

现在,我不明白的是,如何以及为什么var2里面的地址是0x10010010? str1位于地址0x10010003之内,因为我们为var1保留了3位。

最后一件事是,指令.align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used究竟是对齐3`还是以上,但我真的不明白。

对不起,如果这是非常混乱的家伙,我有点绝望在这里。

回答

9

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

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

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

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

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

这个例子是人造的,没有明显的理由在这里使用.ALIGN指令,因为.HALF只需要对齐到2的倍数,因此将它存储在0x10010014就可以。

+1

正在打电话给我的答案,而没有...你的本来就不需要另一个。 – gnometorule

+0

谢谢大家的回答!问题:0x10010010是4的倍数? – Sobiaholic

+0

0x10010010 = 2^28 + 2^16 + 2^4,这是4的倍数。如果计算对您没有意义,请再次阅读十六进制数字。 – gnometorule

3

某些汇编指令意味着数据存储对齐,这意味着从两个的的地址开始。回想一下第一几个公约在MIPS:

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

(2)一个半字(.half)是2-字节和

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

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

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