アセンブラを吐かせる。
gcc -S hello.c
こんな出力が。
.cstring LC0: .ascii "Hello C!\0" .text .globl _main _main: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp call L3 "L00000000001$pb": L3: popl %ebx leal LC0-"L00000000001$pb"(%ebx), %eax movl %eax, (%esp) call L_puts$stub movl $0, %eax addl $20, %esp popl %ebx leave ret .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 L_puts$stub: .indirect_symbol _puts hlt ; hlt ; hlt ; hlt ; hlt .subsections_via_symbols
AT&T表記
- レジスタの名前の前に%
- レジスタの値が指すアドレスを表わすときは()
- longとかDWORD、BYTEの修飾のためにlやw、bを付ける(付録1に詳細が)
アセンブリ言語
- 「55」という2桁の16進のマシンコードを「pushl %ebp」という表現として定義
- CPUに対する命令を、このような人間にとって分かりやすい(?)表現にしたものがアセンブリ言語
アセンブラのリスティングファイル
as -al hello.s
がMacだと動かなす。。。
ESP、CPU、メモリ
この本だと%espと書くらしい。CPUの中のレジスタと呼ぶ特別な記憶領域。レジスタは値を保存するだけでなく、演算や実行状態を保存する特別な役割がある。CPU
- 一連の命令を順に読み込んで解釈し、その結果に従ってデータの移動や演算を行なう
- 演算をするときの値や結果などの情報はレジスタおちう特別な記憶領域に保存される
- ESPはレジスタの一つ
- レジスタには(授業で出てきてたような)
- アキュムレーター
- カウントレジスタ
- ベースポインタ
などなどいくつか種類がある。
gdbでデバッグ
gcc -g -o hello hello.s
でアセンブラもデバッグできる。gdbすごす。