Kon*_*lis 2 assembly mips mips32 qtspim
该指令.align n在数组中做什么?
更具体地说,假设我具有以下代码部分:
array: .align 2
.space 800
Run Code Online (Sandbox Code Playgroud)
它的重要性是什么,为什么不跳过它并使用
.space 800
Run Code Online (Sandbox Code Playgroud)
这是学校的作业理论问题。
直接从MARS帮助工具提示中获取:
在指定的字节边界上对齐下一个数据项(0 =字节,1 =半字,2 =字,3 =双精度)
考虑这段代码
la $t0, array
.data
.space 3
array:
.space 12
Run Code Online (Sandbox Code Playgroud)
这被组装成
lui $at, 0x1001
ori $t0, $at, 0x0003 #$t0 = 0x10010003
Run Code Online (Sandbox Code Playgroud)
显示array地址为0x10010003。
使用.align指令:
la $t0, array
.data
.space 3
array:
.align 3
.space 12
Run Code Online (Sandbox Code Playgroud)
给出:
lui $at, 0x1001
ori $t0, $at, 0x0008 #$t0 = 0x10010008
Run Code Online (Sandbox Code Playgroud)
现在的地址是0x10010008。
不同之处在于,后一个地址在双边界上对齐。
双精度数是8个字节长,地址是8个字节的倍数。
对齐可提供更好的性能,因为CPU会按字块读取内存,并且此块从四个地址的整数倍(0x0、0x4、0x8 ...)开始。
如果请求一个0x3的字,CPU需要读取0x0的一个字和0x4的一个字并将结果合并。
在某些体系结构中明确不支持未对齐的访问。如果我没记错的话,就数据而言,MIPS并不是那么严格(但它是针对代码的)。
请注意,.align n将下一个数据项对齐在2 n个边界上,或者等效地(作为练习,留给读者阅读)将数据项移动到低n位为零的地址。
MARS出现,相反大多数汇编,以“附加”标签到下一个空间分配指令(如.byte,.space等),而不是当前位置计数器。
因此,标签可以在.align和.space指令之间移动。
.align 2 | array:
array: | .align 2
.space 12 | .space 12
Run Code Online (Sandbox Code Playgroud)