gcc実験メモ(4)
はじめに ターゲットをRiscVにして作成したELFファイルのテキスト領域を解釈する、というのをもう一度行う。 今度は少しだけ複雑にするが、まだ簡単である。結果だけ載せる。 題材1 Cコード int add(int a, int b) { return a + b; } コマンド FILE=add_sub_risc; clang --target=riscv64-linux-musl -static -c -o $FILE.o -fuse-ld=lld $FILE.c riscv64-unknown-elf-objdump --disassemble $FILE.o オブジェクトファイルのRiscV命令列 0000000000000000 <add>: 0: 1101 addi sp,sp,-32 2: ec06 sd ra,24(sp) 4: e822 sd s0,16(sp) 6: 1000 addi s0,sp,32 8: fea42623 sw a0,-20(s0) c: feb42423 sw a1,-24(s0) 10: fec42503 lw a0,-20(s0) 14: fe842583 lw a1,-24(s0) 18: 9d2d addw a0,a0,a1 1a: 60e2 ld ra,24(sp) 1c: 6442 ld s0,16(sp) 1e: 6105 addi sp,sp,32 20: 8082 ret 解釈 関数のセットアップ処理 sp -= 32 [sp + 24] = ra [sp + 16] = s0 s0 = sp + 32 関数の処理 変数int aがs0-20に対応。 a0の値をaに保存。aは4byteなので、32bit。 ...