| #!/bin/sh |
| |
| # A tool to disassemble one riscv64 instruction. |
| |
| if [ "$#" -ne 1 ]; then |
| echo "Usage:" |
| echo " $ riscv64-disasm 0x60469613" |
| echo "0: 60469613 sext.b a2,a3" |
| echo |
| echo " The prefix \"0x\" is optional. Compressed instructions are also allowed." |
| exit |
| fi |
| |
| TEMP="$(mktemp)" |
| INSN="0x$(echo $1 | sed -e "s/^0x//")" |
| |
| echo ".text" > "$TEMP.S" |
| echo ".word $INSN" >> "$TEMP.S" |
| |
| # riscv objdump only understands extensions in elf files, so we cannot |
| # disassemble a pure binary. |
| # Add needed extensions to march when required. |
| riscv64-linux-gnu-as -march=rv64gc_zba_zbb_zbs_v -o "$TEMP.o" "$TEMP.S" |
| # Assembler marks .word bytes as data pool ("$d"), and objdump doesn't |
| # disassemble such instructions. Strip symbols to force instruction disassembly. |
| riscv64-linux-gnu-strip "$TEMP.o" |
| riscv64-linux-gnu-objdump -M numeric -d "$TEMP.o" | sed '0,/<.text>/d' |
| |
| rm "$TEMP.S" "$TEMP.o" |