0

我想将 0x0200bff8 地址中的一个字加载到 t1 寄存器中。我尝试了以下方法;

 lui t0, 0x0200b; // Write Upper 20 bits into t0
 lw t1, 0xff8(t0);  //fetch a word from address in t0 offsetted by 0xff8 (12 bits)

我认为它在语法上是正确的,但我看到了这个错误

错误:非法操作数“lw t1,0xff8(t0)”

我做错了什么,就减少从立即地址加载单词的指令而言,什么是好方法?

4

2 回答 2

2

0xff8 是十进制的 4088。该值超出了 12 位有符号立即数lw(以及所有其他 I-Type 指令)的范围。

您可以尝试使用类似 -8(t0) 的语法,虽然这将转换为lw具有立即字段的机器代码ff8,但由于符号扩展,它将获得错误的地址 (0x200aff8)。

但是,您的li解决方案更易于使用。如果您仔细查看 2 指令扩展,您会发现用于减轻 I-Type 指令上 12 位立即数发生的符号扩展的lui用途200c

另外,请注意,您的li伪指令方法可能会lw直接使用(取决于汇编程序):

lw t0, 0x200bff8

但是,如果这是在一个紧密循环中,它表示 2 条指令,而该li形式可用于将地址创建到循环外部的寄存器中,那么在里面只lw需要一个简单的。

为了两全其美,优化编译器将只放置一个lui循环外部(而不是 lui/addi 对),然后使用一种指令形式,lw其余的偏移量。

于 2021-06-24T15:31:17.760 回答
0

我刚刚找到了一个可以完成工作的伪指令li t0, 0x200bff8;

于 2021-06-23T22:26:06.880 回答