我如何将RISC-V汇编伪指令转换为真正的RISC-V指令?

4
我需要使用一个不支持伪指令的特定工具链(.a/.as/.S文件)构建大型RISC-V汇编程序。(Synopsys' ASIP designer tool为定制的CPU/指令集创建自定义汇编器。)
这些程序可以通过GCC(使用GAS)装配,但我需要使用的汇编器不识别伪指令。 它只能处理使用实际RISC-V机器指令编写的程序。
是否有一种工具或GCC或GAS选项可以将所有伪指令解析为真实的RISC-V指令,而无需更改程序的其余部分?

你的意思是汇编器,而不是编译器,对吧?你并没有使用GCC将代码编译成汇编语言,而只是使用gcc来调用asld,我想这是为了处理已经手写好的.S文件。(你可能可以先汇编再反汇编,但大多数方法都会丢失标签和指令。) - Peter Cordes
1
最简单的方法可能是改进这个自定义汇编器,以支持RISC-V手册中记录的标准伪指令。或者,如果这个汇编器有宏语言,可以将它们定义为宏。我认为你可以使用GAS.macro来处理大多数/所有伪指令,但你没有使用GAS。 - Peter Cordes
1
只是好奇--你在使用哪个工具?这是否适用于所有伪指令还是只适用于某些伪指令?官方伪指令和GCC特定的伪指令之间有区别吗? - Lindydancer
你可以编写sed/awk/其他脚本,或编写自己的预处理工具。 - Erik Eidt
@PeterCordes 是的,你说得对,严格来说,我是从汇编语言开始跳过了编译。我不能真正修改这个自定义汇编器,因为它不是一个特定的汇编器。这是为所有基于自定义处理器设计创建的Synopsys ASIP设计工具自动生成的编译器而设计的(因此这些编译器只能识别真正的指令集)。我可以编写脚本来完成任务,但这个问题的整个重点是找出是否已经存在这样的脚本,可能节省时间和实现错误。 - Sherif AbdelFadil
1个回答

3

我不确定我完全理解你的问题。但我认为,也许结合使用脚本和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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接