逆アセンブルとは機械語をアセンブラに変換すること
objdump は一つ以上のオブジェクトファイルについて情報を表示
$ objdump -d -M intel /bin/ls
…
Disassembly of section .fini:
0000000000016200 <.fini>:
16200: d503201f nop
16204: a9bf7bfd stp x29, x30, [sp, #-16]!
16208: 910003fd mov x29, sp
1620c: a8c17bfd ldp x29, x30, [sp], #16
16210: d65f03c0 ret
一番左の 16200: は機械語が入っているメモリ
d503201f は実際の機械語
int main() { return 42; }
$ cc -o test1 test1.c
$ ./test1
$ echo $?
42
$?をechoで終了コマンドを出力
test2.s
.intel_syntax noprefix .globl main main: mov rax, 42 ret
### 関数呼び出し
関数で元々実行していたアドレスをリターンアドレスという
リターンアドレスはメモリのスタック上に保存される
スタックトップを保持している記憶領域をスタックポインタという
int plus(int x, int y) { return x + y; } int main() { return plus(3, 4); }
第一引数はRDIレジスタ、第二引数はRSIレジスタに入れる
x86-64は通常2つのレジスタしか受け取らない
関数からの返り値はRAXに入れるとなっている
callとretは対になる命令
.intel_sytax noprefix .global plus, main plus: add rsi, rdi mov rax, rsi ret main: mov rdi, 3 mov rsi, 4 call plus ret