悩んだ悩んだ、出展探すのに。結局は、Microsoftさんのサイトでなく、Intelさんで見つけた。
探し物は、「汎用レジスタ」について。
ソース見て、書いて、いじれば自然と判ってきたけれど、やっぱり、「こうだよ」と背中をおしてほしいじゃない?出展はここで、こうだからこうなんだよ?としっかりと脳味噌に理解させたいしさ。
というわけで、
日本語技術資料のダウンロード
http://www.intel.com/jp/download/index.htm
の中の「IA-32 インテルR アーキテクチャ ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ」の60ページ、3-4「基本プログラム実行レジスタ」の章がズバリそれ。
・ EAX - オペランドと結果データ用のアキュムレータ。
・ EBX - DSセグメント内のデータに対するポインタ。
・ ECX -ストリング操作およびループ操作用のカウンタ。
・ EDX -I/Oポインタ。
・ ESI - DSレジスタがポイントするセグメント内のデータに対するポインタ;スト
リング操作ではソースポインタ。
・ EDI - ES レジスタがポイントするセグメント内のデータ(またはデスティネー
ション)に対するポインタ;ストリング操作ではデスティネーション・ポインタ。
・ ESP -(SSセグメント内の)スタックポインタ。
・ EBP - (SSセグメント内の)スタック上のデータに対するポインタ。
ああ、すっきりした。
MASMでプログラミングする時に、同じ機能を書いたとしても、汎用レジスタを目的にあわせて正しく使ってないと変な動きになったり、例外になったりしちゃうって判った。
とりあえず、上中下。がっつり読んでみたなぁ。
とその前に、発端となったプログラム(イミフ)のソース。
呼び出し元はC。
#include
int MasmPlus(int);
int wInt = 11;
int main(int argc, char* argv[])
{
printf ("%d\n", wInt);
printf ("%d\n", MasmPlus (14));
return 0;
}
呼ばれMASM。やりたかった事は、渡された数字をwIntに足すだけの処理。
; Filename: MasmPlus.ASM
.386
.MODEL flat, C
EXTERN wInt:DWORD
.CODE
MasmPlus PROC addInt:DWORD
mov esi, addInt
mov ebx, wInt
add esi, ebx ;esiなので正しくない
ret
MasmPlus ENDP
END
結果(11+14なのにorz)
で、これを下記のように修正して、
; Filename: MasmPlus.ASM
.386
.MODEL flat, C
EXTERN wInt:DWORD
.CODE
MasmPlus PROC addInt:DWORD
mov eax, addInt
mov ebx, wInt
add eax, ebx ;eaxに変えてみる
ret
MasmPlus ENDP
END
実行すると、
おお、動いた。