う え き ぷ に き あ く ん 笑 Advent Calendar 2021 17日目です
この記事について
本記事は、(半分自分用の)アセンブリの命令の一部分の早見表となっています。
src, dest, argという表記は、それぞれsorce, destination, argumentを表します。
記法については、Intel記法を用いています。
32bit環境を想定しています。つまり、RAXやRDXなどではなく、EAXやEDXなどを説明に使用します。
演算命令
加算
add dest, src
destにsrcを足す
減算
sub dest, src
destからsrcを引く
乗算
mull src
EAXレジスタの値をsrcで掛け、演算結果の上位4バイトをEDXレジスタ、下位4バイトをEAXレジスタに格納する
除算
div src
EDXレジスタとEAXレジスタをつなげたもの(EDX:EAXとします)をsrcで割り、商をEAXレジスタ、余りをEDXレジスタに格納する
インクリメント, デクリメント
inc dest
dec dest
destに対してインクリメント, デクリメントを行う
減算(条件分岐用)
cmp dest, src
subと同じ演算を行うが、結果は保持されず、破棄される
フラグレジスタの変更が主な目的
データ転送命令
値の代入
mov dest, src
destにsrcの値を代入する
値の代入(アドレスから)
lea dest, src
まずsrcのアドレスを計算し、その結果をdestに格納する
値の交換
xchg arg1, arg2
arg1とarg2の値を交換する
スタックの操作命令
値の追加
push arg
ESPレジスタの値を4バイト減算し、argの値をESPレジスタが指すスタックの場所に格納する
値の取り出し
pop dest
ESPレジスタが指すスタックの場所の値をdestに格納し、ESPレジスタを4バイト加算する
bit演算
シフト
shl dest, count
shr dest, count
shlは左に、shrは右に、destをcount分シフトする
ローテート
rol dest, count
ror dest, count
rolは左に、rorは右に、destをcount分ローテートする
論理和
or dest, arg
destとargの論理和を計算し、結果をdestに格納する
論理積
and dest, arg
destとargの論理積を計算し、結果をdestに格納する
排他的論理和
xor dest, arg
destとargの排他的論理和を計算し、結果をdestに格納する
同じレジスタ同士のxor(例えば、xor eax, eaxなど)を行い、レジスタを0で初期化することがある
分岐
ジャンプ
jmp arg
argの値が指すアドレスをEIPレジスタに格納することで、処理を分岐させる
ジャンプ命令には、jz(ゼロフラグ=1のときジャンプ), jae(桁溢れのフラグ=0のときジャンプ)など、様々な種類がある
jmpは無条件で分岐
コール
call arg
jmpと同じように分岐するが、分岐した先で後述するretを行うと元の実行位置に戻ってくることができるよう、EIPレジスタの値をスタックにpushするという動作も行う
リターン
ret
callで分岐した処理の最後に用いられ、スタックからEIPレジスタへ復帰アドレスをpopする
最後に
いかがでしたか?こうして見ると、意外とアセンブリの命令は見やすい(当社比)ことが分かりますね!
今後は、本記事では省略したレジスタの説明や、呼出規約、スタックについてなどを書ければな、と思います。
明日の記事は!うえきさん!よしなにです〜