birabiraのめも

忘れっぽいのでここにメモをしていきます

アセンブラ入門 -命令その1、四則演算編-

やっとやる気になったので命令をググっていきたいと思います。
今回もアーキテクチャx86デス。
Intelでの記法になるのかな?ここらへんよくわかりません!

それでは始めます。



  • MOV <値の移動>
MOV    EBP,    ESP        ; ESPの値をEBPにコピー
MOV    EAX,    33         ; 33をEAXに代入
MOV    [1234h],    EBX    ; 1234h番地にEBXをコピー

; 書式
; MOV レジスタ|メモリ, レジスタ|メモリ|即値
; 右から左へ代入される

影響を受けるフラグ

  • なし

値を移動する命令
メモリからメモリの移動はできない



  • ADD <足し算>、ADC <桁上りを考慮した足し算>
ADD    EAX,    EBX        ; EAX = EAX + EBX
ADD    EAX,    10         ; EAX = EAX + 10
ADD    EAX,    [1234h]    ; EAX = EAX + 1234h番地の内容

; 書式
; ADD レジスタ|メモリ, レジスタ|メモリ|即値

影響を受けるフラグ

OFSFZFAFCFPF
足し算をする命令

ADCはキャリーフラグの値も足される
桁上りを計算できる



  • SUB <引き算>、SBB <桁借りを考慮した引き算>
SUB    EAX,    EBX        ; EAX -= EBX
SUB    EAX,    10         ; EAX -= 10
SUB    EBX,    '0'          ; EAX -= '0'

引き算をする命令。
影響を受けるフラグ

OFSFZFAFCFPF
符号付き整数を計算するときはOFに気をつけなければならない

SBBはキャリーフラグが立っていたら-1する。



  • MUL <符号なし掛け算>、IMUL <符号あり掛け算>
MUL    EBX        ; EAX *= EBX
IMUL   ECX        ; EAX *= ECX

; 書式
; MUL  レジスタ

掛け算をする命令
IntelCPUの仕様で動作が、 「EAX *= レジスタ」になるらしい。
バイト、ワード、ダブルワードで格納するレジスタの容量が違う

bit数格納先レジスタ
byte8bitAL
word16bitAX
dword32bitEAX




  • DEV <符号なし割り算>、IDEV <符号あり割り算>
DEV    EBX        ; EAX /= EBX
IDEV   ECX        ; EAX /= EAX

割り算をする命令
0で割ってはいけない。
MULと同様 「EAX /= レジスタ」になる。


次回から適当になります