LoginSignup
3
2

More than 1 year has passed since last update.

アセンブリ早見表(ごく一部)

Last updated at Posted at 2021-12-17

う え き ぷ に き あ く ん 笑 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する

最後に

いかがでしたか?こうして見ると、意外とアセンブリの命令は見やすい(当社比)ことが分かりますね!
今後は、本記事では省略したレジスタの説明や、呼出規約、スタックについてなどを書ければな、と思います。

明日の記事は!うえきさん!よしなにです〜

3
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2