我有一个任务,我必须将MIPS指令转换为其十六进制机器代码.我知道如何转换add,addi,lw等指令就好了,但是当它达到像beq这样的指令时,我会感到困惑.我如何将此beq转换为十六进制?
0x00400108 beq $t3, $t5, NEXT
0x0040010C j END
Run Code Online (Sandbox Code Playgroud)
NEXT的地址是
0x0040011C
Run Code Online (Sandbox Code Playgroud)
?
我尝试过的:
beq操作码= 4
$ t3 =注册11
$ t5 =注册13
NEXT = 0x0040011C - 0x0040010C = 10(十六进制)= 16(十进制)
4 11 13 16 (decimal)
000100 01011 01101 0000 0000 0000 1000 (convert to binary)
0001 0001 0110 1101 0000 0000 0000 1000 (group into fours)
1 1 6 D 0 0 0 8 (hexadecimal)
Run Code Online (Sandbox Code Playgroud)
但这是错的......
经过长时间的愚蠢,我找到了正确的答案.
汇总代码:
beq $t3, $t5, NEXT
[instruction 1]
[instruction 2]
[instruction 3]
[instruction 4]
NEXT: [instruction 5]
Run Code Online (Sandbox Code Playgroud)
正如Michael所说,偏移量是分支指令后指令的字数.指令1是beq之后的以下指令,因此从那里开始计数直到NEXT.指令1和NEXT有4条指令,因此beq的格式现在是:
op | rs | rd | 16-bit constant or address
000100 | 01011 | 01101 | 0000 0000 0001 0000
Run Code Online (Sandbox Code Playgroud)
其中rs是$ t3,rd是$ t5.
重新组合并转换为十六进制:
0001 | 0001 | 0110 | 1101 | 0000 0000 0001 0000
1 | 1 | 6 | D | 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
所以十六进制表示是116D0010.干杯.编辑:指令是字,4指令*4字节= 16字节