- 此问题在此处已有答案**:
How to Calculate Jump Target Address and Branch Target Address?(4个答案)
19小时前关门了。
假设我们需要跳转到内存地址0xAE87698C。如果当前PC值为0xAF70018B,则显示j指令以执行跳转(显示为32位二进制数和等效的十六进制值)
我知道我需要将其中一个向左移位,然后使用PC的四个高位作为新地址,但我不知道何时移位,何时加上PC值
How to Calculate Jump Target Address and Branch Target Address?(4个答案)
19小时前关门了。
假设我们需要跳转到内存地址0xAE87698C。如果当前PC值为0xAF70018B,则显示j指令以执行跳转(显示为32位二进制数和等效的十六进制值)
我知道我需要将其中一个向左移位,然后使用PC的四个高位作为新地址,但我不知道何时移位,何时加上PC值
1条答案
按热度按时间g52tjvyc1#
如果你记得指令是4字节的,并且总是对齐的,那就很容易了。同样的,两个低位总是零,没有理由存储它们。这就是为什么你移位2,把它们砍掉。如果你再看看指令编码,你会发现前6位是操作码,地址只有26位可用。因为我们已经砍掉了两位,我们的地址是30位,所以最高的4位不适合。2在编码过程中,你应该验证这些位与当前的PC相同。3在解码过程中,这些位将从PC填充。
在你的例子中,你有
0xAE87698C
。前4位只是前导十六进制数字,所以很容易与PC进行比较。检查出来,两者都有0xA
。然后我们可以处理其余的位:0x0E87698C
。将其移位2位(除以4),并且这将给予指令的低26位:0x3A1DA63
。前6个是固定值为000010b
或移位为0x08000000
的操作码。您可以通过添加或使用逐位OR
来合并这两个部分,以获得编码0x0BA1DA63
。您也可以使用二进制,如果这对您来说更容易,但它更繁琐,更容易出错。