MIPS组件对齐对齐n

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)

这是学校的作业理论问题。

Mar*_*oom 5

直接从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)