在机器代码中编码Assembly MIPS指令

时间:2015-06-10 09:35:34

标签: assembly mips

我需要编码以下beq指令:

...
start: addu $8, $9, $10
       addiu $8, $8, 0x00FF7A01
       beq $8, $0, start
...

我知道它是一个J格式指令,所以除法将是6位操作码,6位是目标地址。 beq操作码为000100,因此我已经0001000100000000,但我不知道如何找到剩下的16位,有什么帮助?

2 个答案:

答案 0 :(得分:2)

在MIPS中,在beq期间,要添加到program counter的偏移量计算如下:

signextend immediate value

offset = (immediate value) << 2 

新PC计算如下:

pc += offset

此处,在您的代码中,如果pc,您希望将3移回12字节或$8 == $0指令。因此,要将FFFFFFF4作为偏移添加到pc,您将需要的直接值将是最后2个字节:

FFFFFFF4 >> 2 = FFFFFFFD

你也可以理解为:

Address
00000000 start: addu $8, $09, $10
00000004        addiu $8, $8, 0x00FF7A01
00000008        beq $8, $0, start
0000000C ...
执行beq pc

将在0000000C。假设$8 == $0然后pc应该再次成为00000000。因此offset = final_pc - initial_pc = 00000000-0000000C。 所以,

offset = FFFFFFF4

immediatevalue = ((FFFFFFF4) >> 4)的最后2个字节。因此,

immediate_value = FFFD

快捷方式:此外,您可以直接计算要转移程序计数器的words的数量,而不是计算此长度。在这里你想向后3 words,因此immediate_value = -3 = FFFD。如果你想前进而不是后退,这也是正确的。

答案 1 :(得分:2)

执行beq $8, $0, start时,PC包含下一条指令的地址。如果$8$0的内容不相等,则不会跳转,这意味着PC的值不会发生变化。

但如果$8$0的内容相同,则您希望跳转到标签start。换句话说,你想要的是这个 - 你希望PC包含指令addu $8, $9, $10的地址。

因此,需要计算电脑的当前值与跳跃时值之间的差异。

跳转指令数= 3(但由于我们希望PC跳转到上一条指令,所以指向负方向)。

二进制等价-3 = 2的补((0000 0000 0000 0011) 原来是1111 1111 1111 1101

因此,此beq指令的32位表示形式为:

0001 0010 0000 0000 1111 1111 1111 1101

[beq的6位操作码] [5位寄存器$ 8] [5位寄存器$ 0] [16位相对地址]