【问题标题】:How to load an immediate number to a register in RV32I Base Instruction Set?如何将立即数加载到 RV32I 基本指令集中的寄存器中?
【发布时间】:2019-06-26 22:11:42
【问题描述】:

最近,我正在研究 RV32I 基本指令集,我没有发现任何指令看起来像 LD r1, imm。因此,我想知道汇编程序员如何将立即数加载到 RV32I 系统中的寄存器中?谢谢。

为此,程序员可以使用 ADDI r1, r0, imm。由于 r0 是一个常数 0,所以这条指令将 imm 移动到寄存器 r1。

不知道RV32的设计者是不是这么想的,用ADDI代替LD r1,imm?

希望任何人都可以对此有所了解。谢谢。

【问题讨论】:

    标签: riscv


    【解决方案1】:

    有一个 li(立即加载)别名或伪指令也提供了您所指的功能。

    以下示例显示了用于加载立即数的 li 伪指令: .section .text .globl _start _开始:

    .equ CONSTANT, 0xcafebabe
    
            li a0, CONSTANT
    

    生成以下汇编器输出,如 objdump 所示:

    0000000000000000 <_start>:
       0: 00032537            lui     a0,0x32
       4: bfb50513            addi    a0,a0,-1029
       8: 00e51513            slli    a0,a0,0xe
       c: abe50513            addi    a0,a0,-1346
    

    这个 sn-p 来自这个 github markdown,在 riscv 程序集编程时是一个很好的参考。 https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md#load-immediate

    【讨论】:

    • 我查看了RV32I的规范,发现有两个指令,所谓的LUI和AUIPC。 LUI 和 ADDI 可以一起使用将 32 位立即数加载到某些寄存器,而 AUIPC 和 LB 可以一起使用来访问存储在地址(PC + 32 位偏移量)的任何数据,以及 AUIPC 和 JALR可以一起使用跳转到任何从地址(PC + 32 位偏移)开始的过程。
    • @Betty 我编辑了答案以显示有关伪指令正在做什么的更多上下文。还有一个 la(加载地址)伪指令也可能有用。 github.com/riscv/riscv-asm-manual/blob/master/…。但是您的评论看起来是正确的。
    猜你喜欢
    • 2020-07-13
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 2020-07-20
    相关资源
    最近更新 更多