mips组件对齐对齐n



指令.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 

最新更新