我给了MIPS指令:
top:
lw $t1, ($t0)
beq $s0, $0, end
jal func
add $s0, $s0, $t0
addi $s0, $s0, -1
j top
bne $s0, $0, top
end:
func:
sll $v0, $t1, 4
jr $ra
并告诉我将每行转换为"instruction in hex."我遇到的问题是 jal
指令 . 我知道这是一个Pseudodirect地址,我不明白它是如何写出来的 .
鉴于 jal
指令的OPCode是 3hex
,J-Type指令格式的前6位将是 000011
,如何计算剩余的?
我理解如何完成R-Type和I-Type指令格式的这个任务,但是不能解决这个问题 .
任何帮助都很感激 .
2 回答
首先,您采用操作码,前6位 .
然后你拿下一条指令的地址吧
将其向右移动两个(或执行整数除以4),这样就可以了
将两个值都填充为4个字节
执行按位或
而已 . (虽然我可能在某个地方犯了错误) .
操作码:
0000 11
剩余26位:
Bits 2-27 of the address of label
Explanation :
到目前为止,您所知道的机器语言相当于:
x
表示在这一点上不为人所知 .要查找
jal func
的32位机器语言表示,首先需要的是标签func
的内存地址 . 如果您知道上述任何指令的地址,则为每条指令添加4可以为您提供func
标签的地址 .可以说
func
的地址是0x12345678
(二进制文件:0001 0010 0011 0100 0101 0110 0111 1000
)该地址为32位,而您只需要26位 .
要解决这个问题,你可以做两件事:
1.由于此地址始终为4的倍数,因此最后两位始终为
00
. 因此,我们不需要包含它们 . 因此,func
的新"address"成为:0001 0010 0011 0100 0101 0110 0111 10--
2.现在我们需要在26位中装入30位的
func
地址,因为操作码占用了6位 . 为此,我们忽略了4个最重要的位 . 机器从PC
获取这些4位 . 因此,func
的新"address"成为:---- 0010 0011 0100 0101 0110 0111 10--
func
的这些26位地址使得jal
的32位机器语言成为: