アセンブリ言語を少し詳しく

参考書籍 : 自作エミュレータで学ぶx86アーキテクチャ


インクリメントを行う関数のアセンブリ言語を詳しく見ていく

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  83EC10            sub esp,byte +0x10
00000006  C745FC00000000    mov dword [ebp-0x4],0x0
0000000D  FF45FC            inc dword [ebp-0x4]
00000010  C9                leave
00000011  C3                ret

変数valを初期化する命令がmov dword [ebp-0x4],0x0に対応し、
インクリメントする命令がinc dword [ebp-0x4]に対応する。
dword [ebp-0x4]が変数に該当する。


・基本のmov命令
mov命令で値をコピーできる。
ex) mov ebp, esp
espはスタックポインタと呼ばれ、スタックの最新の読み書き位置を保持している。
2行目でebpにespをコピーし、スタックポインタが移動してもebpで変数にアクセスできるようにしている。
変数の位置を表すアドレスを[ ]で囲むことでアクセスできる。dwordをつけることでその変数が32bitであると指示する。
ex) mov dword [ebp-0x4],0x0


・インクリメント専用のinc命令
オペランドを一つとり、inc op でインクリメントを行う
inc dword [ebp-0x4]に対応する機械語はFF45FCとなっている。
ffがinc命令に、45がModR/Mを、fcがディスプレースメントに対応する。
ModR/Mは、メモリ領域の位置の決め方を決めるもので、45だとebp+8bitディスプレースメントを示す。
ディスプレースメントは、位置の差分で、fc(補数表現で-4)でebp+8*(-4)の位置を示すことになる。