アセンブリ言語
機械語にほぼそのまま1対1で対応するような言語
機械語よりはるかに人間にとって読みやすい
例えば、『実行可能ファイルの16進数表現「55」が、「pushl %ebp」に対応する』などと予め定義しておくことで、そういった利用ができている
拡張子は.s
アセンブリ→機械語の変換も「コンパイル」だが、わかりやすくあえて「アセンブルする」と言ったりもする
記法
Intel記法
gcc -S -masm=intel <input-file>
読みやすい
第一オペランドがdestination
第二オペランドがsource
レジスタの名前はそのまま表記
レジスタの値が指すアドレスを表すときは[]で囲む
AT&T記法
gccやobjdumpのデフォルトの出力
引数の順番がintel記法と逆
第一オペランドがsource
第二オペランドがdestination
レジスタの名前に%を付ける
レジスタの値が指すアドレスを表すときは()で囲む
gccでCコードからアセンブリを出力する
-Sオプションを付ける
$ gcc -S hoge.c
gccでアセンブリを機械語にコンパイルする
$ gcc -o hoge hoge.s
$ ./hoge
構文
<Mnemonic> <Destination>, <Source>
Mnemonic: 命令
Destination: 値を受け取る領域のアドレス
Source: Destinationに作用する値、または値の入っている領域のアドレス
命令の例
x86-64の命令
Cコードをアセンブリにリアルタイム変換するサイト
godbolt
参考
アセンブリに触れてみよう - Qiita
https://speakerdeck.com/tnishinaga/security-camp-2018-baremetal-seminar-material?slide=21
本を見つけた
http://jklp.org/profession/books/mix/
https://zenn.dev/satoru_takeuchi/articles/fb7400bebcaf1c
https://ultra-supara.notion.site/ultra-supara/x86-4dc983c9c4924badbad4e1fe97eb9ad1