繁体   English   中英

如何将 RISC-V 汇编伪指令解析为真正的 RISC-V 指令?

[英]How can I resolve RISC-V assembly pseudo instructions to true RISC-V instructions?

我需要使用特定的编译器编译大型 RISC-V 汇编程序(.a/.as/.S 文件)。 程序用 GCC 编译得很好,但是我需要使用的编译器不能识别伪指令。 它仅适用于仅使用基本 RISC-V 语法编写的程序。

是否有工具或 GCC 编译器选项可用于将所有伪指令解析为真正的 RISC-V 指令,而无需更改程序的 rest?

我不确定我是否完全理解你的问题。 但我认为也许结合使用脚本和objdump或者只是手动交换代码部分可能会起作用。

假设我们有一个包含以下内容的test.S文件(这些都是伪指令):

start:
    nop
    li a2, 42
    mv a3, a4
    not a5, a6
    neg a7, a0
    beqz t0, 1f
    negw t1, t2
    sext.w t4, t5
    seqz t6, a0
    snez a1, a2
    sltz a3, a4
    sgtz a5, a6
1:
    ret

使用gcc我们可以使用以下命令将其编译为 object: gcc -c test.S -o test

现在,使用objdump工具,我们可以打印 object 的指令: objdump -d test

test:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <.L1^B1-0x2c>:
   0:   0001                    nop
   2:   02a00613                li      a2,42
   6:   86ba                    mv      a3,a4
   8:   fff84793                not     a5,a6
   c:   40a008b3                neg     a7,a0
  10:   00028e63                beqz    t0,2c <.L1^B1>
  14:   4070033b                negw    t1,t2
  18:   000f0e9b                sext.w  t4,t5
  1c:   00153f93                seqz    t6,a0
  20:   00c035b3                snez    a1,a2
  24:   000726b3                sltz    a3,a4
  28:   010027b3                sgtz    a5,a6

000000000000002c <.L1^B1>:
  2c:   8082                    ret

objdump使用伪指令打印内容。 但是,您可以使用-M标志使objdump使用伪指令: objdump -d -M no-aliases test

结果是这样的:

test:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <.L1^B1-0x2c>:
   0:   0001                    c.addi  zero,0
   2:   02a00613                addi    a2,zero,42
   6:   86ba                    c.mv    a3,a4
   8:   fff84793                xori    a5,a6,-1
   c:   40a008b3                sub     a7,zero,a0
  10:   00028e63                beq     t0,zero,2c <.L1^B1>
  14:   4070033b                subw    t1,zero,t2
  18:   000f0e9b                addiw   t4,t5,0
  1c:   00153f93                sltiu   t6,a0,1
  20:   00c035b3                sltu    a1,zero,a2
  24:   000726b3                slt     a3,a4,zero
  28:   010027b3                slt     a5,zero,a6

000000000000002c <.L1^B1>:
  2c:   8082                    c.jr    ra

您可以使用它从 object 文件中提取所有指令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM