【问题标题】:How can I resolve RISC-V assembly pseudo instructions to true RISC-V instructions?如何将 RISC-V 汇编伪指令解析为真正的 RISC-V 指令?
【发布时间】:2023-04-01 21:06:02
【问题描述】:

我需要使用不支持伪指令的特定工具链来构建大型 RISC-V 汇编程序(.a/.as/.S 文件)。 (Synopsys 的 ASIP 设计器工具为定制的 CPU/指令集创建了一个定制的汇编器。)

程序可以用 GCC(使用 GAS)很好地汇编,但是我需要使用的汇编器不能识别伪指令。它仅适用于仅使用实际 RISC-V 机器指令编写的程序。

是否有工具或 GCC 或 GAS 选项可用于将所有伪指令解析为真正的 RISC-V 指令,而无需更改程序的其余部分?

【问题讨论】:

  • 你的意思是汇编程序,而不是编译器,对吧?您实际上并没有使用 GCC 编译 to asm,您只是使用 gcc 来调用 asld,我认为,对于已经手写的 .S 文件. (你也许可以先汇编然后再反汇编,但大多数这样做的方法会丢失标签和指令。)
  • 改进这个自定义汇编器以支持 RISC-V 手册中记录的标准伪指令可能是最简单的。或者如果这个汇编器有一个宏语言,把它们定义为宏。我认为对于大多数/所有伪指令,您可能可以使用 GAS .macro 执行此操作,但您没有使用 GAS。
  • 只是好奇——您使用的是哪个工具?这适用于所有伪指令还是仅适用于一些?官方伪指令和 GCC 专用指令有什么区别吗?
  • 你可以写一个sed/awk/other脚本,也可以自己写一个预处理工具。
  • @PeterCordes 是的,你是对的,严格来说,我从汇编程序开始并跳过编译。我不能真正修改这个自定义汇编器,因为它不是一个特定的。这适用于 Synopsys 的 ASIP 设计器工具基于定制处理器设计创建的所有自动生成的编译器(因此这些编译器只能识别真正的指令集)。我总是可以编写一个脚本来完成这项任务,但这个问题的重点是找出它是否已经存在,从而可能节省时间和实施错误。

标签: assembly riscv instructions


【解决方案1】:

我不确定我是否完全理解您的问题。但我认为也许结合使用脚本和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,我们可以使用以下命令将其编译成一个对象:gcc -c test.S -o test

现在,使用objdump 工具,我们可以打印对象的指令: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

你可以用这个从你的目标文件中提取所有指令。

【讨论】:

    猜你喜欢
    • 2018-11-22
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多