指令.align n
在数组中做什么?
更具体地说,我有代码的以下部分:
array: .align 2
.space 800
它的重要性是什么,为什么不只是跳过并使用
.space 800
这是学校的任务理论问题。
直接从火星帮助工具提示:
对指定字节边界上的下一个数据项(0 = byte,1 = half word,2 = word,3 = double)
考虑此代码
la $t0, array
.data
.space 3
array:
.space 12
将其组装到
中lui $at, 0x1001
ori $t0, $at, 0x0003 #$t0 = 0x10010003
显示array
在地址0x10010003。
使用.align
指令:
la $t0, array
.data
.space 3
array:
.align 3
.space 12
给出:
lui $at, 0x1001
ori $t0, $at, 0x0008 #$t0 = 0x10010008
现在地址为0x10010008。
区别在于,后一个地址是在双边界上对齐。
双重为8个字节,地址为8个字节的倍数。
对齐能提供更好的性能,因为CPU读取单词块中的内存,并且该块从四个(0x0、0x4、0x8,...)的地址开始。
如果请求在0x3处的单词,则CPU需要在0x0和0x4上读取一个单词,并合并结果。
在某些体系结构中不明确支持未对齐的访问。如果我没记错的话,关于 data 的MIP并不是那么严格(但这是用于代码)。
陷阱
提防.align n
在2 > n 边界或等效(作为练习介绍给读者)上的下一个数据项,它将数据项移至一个地址下部 n 位为零。
火星与大多数汇编器相反,以"将"标签"附加"到下一个分配指令的空间(例如.byte
,.space
等)而不是当前位置计数器。
因此,可以在.align
和.space
指令之间移动标签。
.align 2 | array:
array: | .align 2
.space 12 | .space 12