为什么在计算分支目标地址时需要乘以4来抵消?
Why is multiplication by 4 needed to offset when you calculate branch target address?
我了解到我在将C代码翻译成MIPS语言时,地址需要乘以4。
即 ) int x = A[1]
=> lw $t1, 4*1 (address of A)
但是不知道为什么分支目标地址也是这样
来自这个问答How to Calculate Jump Target Address and Branch Target Address?
我读到偏移量需要字对齐,因为 PC 地址是这样。
但是那么,PC是字对齐的,而偏移地址是字节对齐的,难道偏移地址不需要除以4吗?
我想我在这里有一些误解。
MIPS 指令都是 4 个字节长 — 而且它们总是位于偶数字边界上。因此,这适用于所有指令地址——分支源和分支目标——因此所有分支偏移量的低 2 位都为 0,因为它们是两个字对齐指令地址之间的差异。
在指令中对那些始终为 0 的位进行编码会很浪费,因此将其省略。
不是将已知始终为零的位编码到指令字段中,而是将这 2 位重新用于允许更大的立即分支位移。这就是为什么有 /4 或 *4 取决于是编码还是解码。
(事实上,PC 寄存器的低两位始终为零,因此硬件甚至不需要 PC 的 32 位寄存器,30 位寄存器就足够了,+1 而不是+4 递增 — 如果是我,我会尝试在内部设置硬件。)
我了解到我在将C代码翻译成MIPS语言时,地址需要乘以4。
即 ) int x = A[1]
=> lw $t1, 4*1 (address of A)
但是不知道为什么分支目标地址也是这样
来自这个问答How to Calculate Jump Target Address and Branch Target Address?
我读到偏移量需要字对齐,因为 PC 地址是这样。
但是那么,PC是字对齐的,而偏移地址是字节对齐的,难道偏移地址不需要除以4吗?
我想我在这里有一些误解。
MIPS 指令都是 4 个字节长 — 而且它们总是位于偶数字边界上。因此,这适用于所有指令地址——分支源和分支目标——因此所有分支偏移量的低 2 位都为 0,因为它们是两个字对齐指令地址之间的差异。
在指令中对那些始终为 0 的位进行编码会很浪费,因此将其省略。
不是将已知始终为零的位编码到指令字段中,而是将这 2 位重新用于允许更大的立即分支位移。这就是为什么有 /4 或 *4 取决于是编码还是解码。
(事实上,PC 寄存器的低两位始终为零,因此硬件甚至不需要 PC 的 32 位寄存器,30 位寄存器就足够了,+1 而不是+4 递增 — 如果是我,我会尝试在内部设置硬件。)