我不确定我完全理解你的问题。但我认为,也许结合使用脚本和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
你可以使用这个工具从你的目标文件中提取所有指令。
gcc
来调用as
和ld
,我想这是为了处理已经手写好的.S
文件。(你可能可以先汇编再反汇编,但大多数方法都会丢失标签和指令。) - Peter Cordes.macro
来处理大多数/所有伪指令,但你没有使用GAS。 - Peter Cordes