OS自作入門 / 2008/08/27 (Wed) / 編集 |
制約:レジスタはEAX,ECX,EDXしか使えない(他はC言語自身が使うから)
サンプルコードから抜粋(*NASKの構文です)
[FORMAT "WCOFF"] ; オブジェクトファイルを作るモード
[INSTRSET "i486p"] ; 486の命令まで使いたいという記述
[BITS 32] ; 32ビットモード用の機械語を作らせる
[FILE "naskfunc.nas"] ; ソースファイル名情報
GLOBAL _write_mem8
[SECTION .text] ; void write_mem8(int addr, int data);
;;addr番地にdataを書き込む _write_mem8:
MOV ECX,[ESP+4] ; [ESP+4]にaddrが入っているのでそれをECXに読み込む
MOV AL,[ESP+8] ; [ESP+8]にdataが入っているのでそれをALに読み込む
MOV [ECX],AL
RET
つまり、[ESP+4*x]番地に関数の第x引数が保存されてるらしい。ここで「INSTRSET "i486p"」というのは「i486モードで作る」という意味で、これがないとECXの意味がかわってしまうらしい。(詳しくは本を読んでねw)
あ、もちろん関数の宣言(GLOBALのとこ)も忘れちゃダメ
でもってC言語側からの使い方例
void write_mem8(int addr, int data);
(中略)
for (i = 0xa0000; i <= 0xaffff; i++) {
write_mem8(i, 15); /* MOV BYTE [i],15 */
}
関数の宣言は忘れずに、ちなみにいうと上の関数は「画面を白に染める」という意味、なぜかというと0xa0000~0xaffffはVRAMの領域で、「15」ってのは「白」という意味だかららしい、へぇ〜
でもって返り値のある関数ではEAXに入っている値が返り値になるらしい
_test: ;int test(int data) MOV EAX,[ESP+4] RET
とすると「test(5)」としたときの返り値は「5」になるらしい
サンプルコードから抜粋(*NASKの構文です)
[FORMAT "WCOFF"] ; オブジェクトファイルを作るモード
[INSTRSET "i486p"] ; 486の命令まで使いたいという記述
[BITS 32] ; 32ビットモード用の機械語を作らせる
[FILE "naskfunc.nas"] ; ソースファイル名情報
GLOBAL _write_mem8
[SECTION .text] ; void write_mem8(int addr, int data);
;;addr番地にdataを書き込む _write_mem8:
MOV ECX,[ESP+4] ; [ESP+4]にaddrが入っているのでそれをECXに読み込む
MOV AL,[ESP+8] ; [ESP+8]にdataが入っているのでそれをALに読み込む
MOV [ECX],AL
RET
つまり、[ESP+4*x]番地に関数の第x引数が保存されてるらしい。ここで「INSTRSET "i486p"」というのは「i486モードで作る」という意味で、これがないとECXの意味がかわってしまうらしい。(詳しくは本を読んでねw)
あ、もちろん関数の宣言(GLOBALのとこ)も忘れちゃダメ
でもってC言語側からの使い方例
void write_mem8(int addr, int data);
(中略)
for (i = 0xa0000; i <= 0xaffff; i++) {
write_mem8(i, 15); /* MOV BYTE [i],15 */
}
関数の宣言は忘れずに、ちなみにいうと上の関数は「画面を白に染める」という意味、なぜかというと0xa0000~0xaffffはVRAMの領域で、「15」ってのは「白」という意味だかららしい、へぇ〜
でもって返り値のある関数ではEAXに入っている値が返り値になるらしい
_test: ;int test(int data) MOV EAX,[ESP+4] RET
とすると「test(5)」としたときの返り値は「5」になるらしい
トラックバック
URL :
コメント