内存操作数'如何对齐?帮助MIPS流水线化?
这本书说:
第四,如第2章所述,操作数必须在内存中对齐。因此, 我们不必担心需要两个数据的单个数据传输指令 内存访问;请求的数据可以在处理器和之间传输 单个管道阶段的内存。
我想我明白一条数据传输指令不需要两个或更多数据存储器。 但是,我不确定它与内存操作数的对齐有什么关系。
先谢谢!
答案 0 :(得分:5)
lw
指令要求存储器地址字对齐。
因此,要访问未对齐的字,需要访问所需字相交的两个字边界并屏蔽必要的字节。
例如,假设您希望加载存储在地址0x2
的单词。 0x2
不是字对齐的,因此您需要加载存储在0x2
的半字和存储在0x4
的半字。
为此,可以写一下:
lh $t0 2($zero)
lh $t1 4($zero)
sll $t1 $t1 16
or $t2 $t0 $t1
如果你想加载例如存储在地址0x3
的单词,这只会变得更加复杂:
# load first byte
lb $t0 3($zero)
# load second word, mask out first 3 bytes
lw $t1 4($zero)
lui $t2 0x0000FFFF
ori $t2 $t2 0xFFFFFFFF
or $t1 $t1 $t2
# combine
sll $t1 $t1 8
or $t2 $t0 $t1
因此,可以看出,字对齐的要求并非帮助 MIPS被流水线化,而是对未对齐字的访问需要额外的内存访问 - 这是ISA的限制