モチベーション
-
エンジニアならアセンブラ読めて当然だよね
的な煽り文句をはてぶで受けた - 年末年始でとりあえず入門してみよう
- 飽きたら即終了の予定
参考書籍
2017_12_28 基礎知識と計算式
アセンブラの単位
アセンブラの命令 = 各CPUが実際に実行する命令
アセンブラ/アセンブリ/アセンブル
- アセンブリ => アセンブリ言語プログラム
- アセンブラ => ソフトウェア、命令の全てが整数
- アセンブル => アセンブラが行う操作のこと
まとめ アセンブリ言語をアセンブラを通してアセンブルする
アセンブリ言語の1行1行はニモニック ソースオペランド デスティネーションオペランド
で構成される
アセンブラの種類
この二つ、パラメータの順序もコマンドも異なる
- Intel表記
- AT&T表記
- GNUアセンブラ(GAS)はこちら
書き方
▼コメント
XXXXX YYYYYYYY ;{この部分はコメント}
▼値の移動
mov 2h ah,02
2という値をCPUの2h
に転送(=値の移動)させる
▼値の移動
mv1 $88, %ecx
88($88=10進数的に88)をecx
というところに転送している
▼値の移動
mv1 $1 -4(%rbp)
1を RBPというレジスタから−4引いた場所
に転送する
▼値の計算
計算した値は全てデスティネーションに保存される
加算処理
addl %edx %eax
減算処理
sub1 -8(%rbp) %eax
商算処理
imul1 -8(%rbp) %eax
除算処理
idiv -8(%rnp) %eax
- ソースにはメモリもレジスタも可能
- デスティネーションはレジスタのみ
▼アドレスを保存
サイズはq
ソースのアドレスをデスティネーションに保存(転送では無い)
leaq .LC0(%rip), %rcx
▼出力
leap .LC0(%rip), %rcx
call prinf
.LC0(%rip)
は、printfが使うアドレス、前もってprintfで使用する書式を設定している
▼64bit拡張
32bitから64bitに符号拡張する
mov1 -4(%rbp) %eax
cltd
レジスタ/メモリアドレス
レジスタとメモリアドレスは別物
- レジスタ
- 計算する場所
- RBP
- EDX
- EAX
- メモリアドレス
- 保存する場所
- RBP-4
- RPB-8
最重要なレジスタ => RAX
レジスタ(別名アキュムレータ
)
-
64bitを扱うときは
RAX
レジスタ -
32bitを扱うときは
EAX
レジスタ(RAXレジスタの下位32bit) -
16bitを扱うときは
AX
レジスタ(EAXレジスタの下位16bit) -
8bitを扱うときは
AH
レジスタまたはAL
レジスタ(AXレジスタの上位8bitをAH
, 下位8bitをAL
) -
RAX
- 最頻出
- アキュムレータ
- 算術演算
- 操作結果保存
-
RBX
- ベースレジスタ
- メモリアドレス保存
-
RCX
- カウンタレジスタ
- シフト/ローテート命令
- ループ命令
-
RDX
- データレジスタ
- 算術演算操作
- I/O操作データ保存
-
RBP
- スタックベースポインタ
- スタックのベースの場所を示す