[英]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.