了解程序集MIPS .ALIGN和内存寻址

Sob*_*lic 8 assembly mips

我正在学习这门课程,而且我真的很难理解指令的.align概念.

这是一个我无法理解的例子:

在此输入图像描述

我知道在数据段内部有地址,从0x10010000,0x10010020开始等.

我知道,在每个地址内,有8个内存字段,每个字段有32位.

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

最后一点是,指令究竟.align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used对齐3`及以上,但我并没有真正得到它.

我很抱歉,如果这是非常令人困惑的家伙,我在这里有点绝望.

Han*_*ant 12

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

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

.WORD字段必须与4的倍数对齐.因此不能将其放在0x1001000E(字符串后面的下一个可用位置).汇编程序故意移动该值并留下两个未使用的字节.到下一个地址,即4的倍数,0x10010010.

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

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

这个例子在其他方面是人为的,没有明显的理由在这里使用.ALIGN指令,因为.HALF只需要一个2的倍数的对齐,所以将它存储在0x10010014就可以了.