首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RiscV跳转(j,jal)到错误的地址(由偏移2关闭)

问RiscV跳转(j,jal)到错误的地址(由偏移2关闭)
EN

Stack Overflow用户
提问于 2019-04-09 17:30:36
回答 2查看 1.2K关注 0票数 0

我使用的是riscV处理器(RV32)。通过我在上面写的一些代码,我注意到了一些奇怪的事情。当我使用"JAL“指令或"J”指令跳转到特定地址时,似乎偏移量计算不正确。

假设我有一些代码(PRAM_ResetVector)位于我想跳转到的地址0x00008080。

在汇编"jal x1,PRAM_ResetVector“中,跳转代码如下所示,位于地址0x000085e8。指令编码(risc32)如下0xeff09fa9所示。

然而,执行跳转指令后发生的情况是,我到达地址0x00008082,而不是预期的0x00008080。

我似乎找不到原因,这里有人能帮忙吗?

EN

回答 2

Stack Overflow用户

发布于 2019-04-10 06:33:04

指令是"0xeff09fa9"?这32位实际上是两个不同的双字节指令,c.sd和c.addw。

票数 1
EN

Stack Overflow用户

发布于 2019-04-10 08:27:42

代码语言:javascript
复制
so:
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    jal x1,so
    nop
    j so
    nop


00000000 <so>:
   0:   00000013            nop
   4:   00000013            nop
   8:   00000013            nop
   c:   00000013            nop
  10:   00000013            nop
  14:   00000013            nop
  18:   00000013            nop
  1c:   fe5ff0ef            jal x1,0 <so>
  20:   00000013            nop
  24:   fddff06f            j   0 <so>
  28:   00000013            nop

fe5ff0ef
11111110010111111111000011101111

imm[20|10:1|11|19:12, rd, 110111

1 1111110010 1 11111111 000011101111

1 11111111 1 1111110010 0

0xFFFFFFE4

0x1C + 0xFFFFFFE4 = 0x00000000

gnu工具是经过调试的,所以

代码语言:javascript
复制
0xeff09fa9

这实际上是

代码语言:javascript
复制
0xa99ff0ef

10101001100111111111000011101111

imm[20|10:1|11|19:12, rd, 110111

1 0101001100 1 11111111 00001 1101111

1 11111111 1 0101001100

111111111 1010 1001 1000

0xFFFFFA98 + 0x000085e8 = 0x8080

是的,一切看起来都很好,所以回到第一个评论,这是哪个IP?听起来像是未经测试和开发中的?

或者,围绕它的代码并没有执行您认为的指令。

这不是两个压缩指令,低半字的低两位是2b11,这意味着如果代码被半字关闭,0xfe5f仍将是32位指令,但我认为它是未定义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55589501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档