0

我发现了这个考试问题,我必须beq说明指令是如何用机器代码编码的。

这是代码:

loop:  addu    $8, $9, $10
    addiu   $8, $8, 0x00FF7A01
    beq    $8, $0, loop

虽然我的第一个问题是0x1100FFFD正确的答案是0x1100FFFB。我相信这是因为0x00FF7A01大于 16 位并且addiu $8, $8, 0x00FF7A01必须在不止一条指令中“反编译”。

所以这是我的问题。

Q1 - 在什么中addiu $8, $8, 0x00FF7A01解构?

Q2 - 如果beq指令上的立即数字段大于 16 位怎么办?我必须使用jumps吗?

4

2 回答 2

1

Q1)

对于您的第一个问题,您的意思是汇编,而不是反编译。

 addiu   $8, $8, 0x00FF7A01

您的评估是正确的,因为即时值大于我们可以在单个指令中存储的值,我们需要使用多个指令。汇编器将为此使用 $at(Assembler Temporary,即 $1)寄存器。

lui    $at, 0x00FF
ori    $at, $at, 0x7A01
addu   $t0, $t0, $at

Q2)

分支指令使用所谓的 PC 相对寻址 - 立即值不包含实际地址,而是字偏移量。由于我们知道指令必须是字 (2^2) 对齐的,因此低 2 位始终为零。实际地址将通过将偏移量左移 2 并将其添加到分支后面指令的地址来即时计算。最终值将是我们相对于 PC 的有效地址。所以我们实际上有 17 位可以使用(技术上是 18,但偏移量是有符号的)。

当偏移量超过该范围时,汇编器将使用远分支 - 一个分支后跟一个跳转。

beq $x, $y, label

会变成

      beq   $x, $y, temp
      # ...
      j tskip
temp:
      j tlabel
      # ...
      # ...
tskip:
于 2012-06-26T15:36:48.993 回答
0

不知道汇编器在这里是如何工作的,但要addiu $8, $8, 0x00FF7A01正确组装,正如您所料,需要多条指令。通常,addiu是仅接受 16 位整数的有效指令。

该指令addiu $8, $8, 0x00FF7A01被最低限度地重写为以下 3 条指令:

addiu $8, $8, 0x7A01
lui $11, 0x00FF // Assume nothing significant is stored in $11
addiu $8, $8, $11

由于现在与分支指令有 5 条指令的差异,我们需要将 -5 放在 的立即数字段中beq,即 0xFFFB(此处详细说明)。

如果目标超出 -2 17到 2 17 -1 字节的范围(或指令数的 15 次方),则必须使用跳转指令。

于 2012-06-26T08:17:44.670 回答