Mips 考试机代码编码

Mips 考试机代码编码,mips,opcode,Mips,Opcode,我发现这个考试题,我必须告诉大家beq指令是如何用机器码编码的 代码如下: loop: addu $8, $9, $10 addiu $8, $8, 0x00FF7A01 beq $8, $0, loop 虽然我的第一个问题是0x1100FFFD,但正确答案是0x1100FFFB。 我认为这是因为0x00FF7A01大于16位,并且addiu$8,$8,0x00FF7A01必须在多条指令中“反编译” 下面是我的问题 Q1-在什么是中加上$8,$8,0x00FF

我发现这个考试题,我必须告诉大家
beq
指令是如何用机器码编码的

代码如下:

loop:  addu    $8, $9, $10
    addiu   $8, $8, 0x00FF7A01
    beq    $8, $0, loop
虽然我的第一个问题是
0x1100FFFD
,但正确答案是
0x1100FFFB
。 我认为这是因为
0x00FF7A01
大于16位,并且
addiu$8,$8,0x00FF7A01
必须在多条指令中“反编译”

下面是我的问题

Q1-在什么是
中加上$8,$8,0x00FF7A01
反编译


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

不确定这里的汇编程序是如何工作的,但要允许正确汇编
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(详细说明)

如果目标在-217到217-1字节的范围之外(或在指令数方面达到15的幂次方),则必须使用跳转指令。

Q1)

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

 addiu   $8, $8, 0x00FF7A01
您的评估是正确的,因为立即值大于我们在单个指令中可以存储的值,所以我们需要使用多个指令。汇编器将使用$at(汇编器临时值,即$1)寄存器进行该操作

lui    $at, 0x00FF
ori    $at, $at, 0x7A01
addu   $t0, $t0, $at
问题2)

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

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

beq $x, $y, label
将成为

      beq   $x, $y, temp
      # ...
      j tskip
temp:
      j tlabel
      # ...
      # ...
tskip:

谢谢你的解释:)谢谢。这是非常明确的