gpt4 book ai didi

assembly - MIPS assembly 对齐 对齐 n

转载 作者:行者123 更新时间:2023-12-01 11:21:53 36 4
gpt4 key购买 nike

指令.align n是什么意思在数组中做什么?
更具体地说,假设我有以下部分代码:

array: .align 2
.space 800

它的重要性是什么,为什么不跳过它并使用
       .space 800

这是一所学校的分配理论问题。

最佳答案

直接取自 MARS 帮助工具提示:

Align next data item on specified byte boundary (0=byte, 1=halfword, 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。

不同之处在于后一个地址在双边界上对齐。
double 是 8 字节长,地址是 8 字节的倍数。

对齐提供了更好的性能,因为 CPU 以字块的形式读取内存,并且这个块从四的倍数地址(0x0、0x4、0x8,...)开始。
如果请求 0x3 处的字,则 CPU 需要读取 0x0 处的字和 0x4 处的字并合并结果。

某些架构中明确不支持未对齐访问。如果我没记错的话,MIPS 在数据方面并没有那么严格(但它是针对代码的)。

陷阱

当心 .align n在 2n 边界上对齐下一个数据项,或者等效地(留给读者练习)它将数据项移动到低 n 位为零的地址。

与大多数汇编程序相反,MARS 似乎将标签“附加”到下一个空间分配指令(例如 .byte.space 等)
而不是当前的位置计数器。
因此标签可以在 .align 之间移动和 .space指令。
  .align 2            |    array: 
array: | .align 2
.space 12 | .space 12

关于assembly - MIPS assembly 对齐 对齐 n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359415/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com