アセンブリ言語を少し詳しく
インクリメントを行う関数のアセンブリ言語を詳しく見ていく
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)の位置を示すことになる。