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」になるらしい
PR
プログラム / 2008/08/27 (Wed) / 編集 |
先日紹介したVIP言語をようやくためすことができたので紹介
事前に用意するもの
今回は学校の学生用サーバ(GNU/Linux てゆうかFedora8)でやってみた
*今回はアセンブラを使いますが、べつに実行ファイル(機械語プログラム)が生成できるならCだろうがJavaだろうが問題ありません
手順的には
事前に用意するもの
- asコマンド(gccコマンドでも可)の入っているパソコン
- VIP言語逆コンパイラ
- VIP言語コンパイラ
- GAS用に書いたプログラム
今回は学校の学生用サーバ(GNU/Linux てゆうかFedora8)でやってみた
*今回はアセンブラを使いますが、べつに実行ファイル(機械語プログラム)が生成できるならCだろうがJavaだろうが問題ありません
手順的には
- アセンブリ言語でGAS用プログラムを作成 LinuxやUNIXなど、gccを使うやつではGASを使っている、ちなみにGASとintel系のアセンブラ(NASMなど)では構文がいろいろ違うので互換性はない
- GAS (GNU Assembler)を使ってアセンブル この時点で実行可能だが、VIP言語のソースを見てみたいので以下も
- VIP逆コンパイラでVIP言語ソースにする これでVIP言語のソースが見れる
- VIP逆コンパイラでVIP言語ソースにする コンパイラもテスト
OS自作入門 / 2008/08/26 (Tue) / 編集 |
とりあえず、Makefileで引っかかったのでメモ
copyコマンドとdelコマンドはUNIXには存在しない
#COPY = copy
#DEL = del
COPY = cp
DEL = rm
Windowsのコピーコマンドはファイルの合併もできるらしいがUNIXのcpではできないので以下
#haribote.sys : asmhead.bin bootpack.hrb Makefile
# copy /B asmhead.bin+bootpack.hrb haribote.sys
haribote.sys : asmhead.bin bootpack.hrb Makefile
cat asmhead.bin bootpack.hrb > haribote.sys
runも書き換えなきゃならんらしいが、リモートログイン(CUI)したLinux上でqemuを使うつもりはないので試してはいない
#run :
# $(MAKE) img
# $(COPY) haribote.img ..¥z_tools¥qemu¥fdimage0.bin
# $(MAKE) -C ../z_tools/qemu
run :
../z_tools/make.exe img
qemu -m 32 -localtime -std-vga -fda haribote.img
run :
$(MAKE) img
qemu -m 32 -localtime -std-vga -fda haribote.img
パッチの作り方
diff -u だめなMakefile 正常なMakefile > パッチ.patch
patch -b パッチを当てたいMakefile パッチ.patch
copyコマンドとdelコマンドはUNIXには存在しない
#COPY = copy
#DEL = del
COPY = cp
DEL = rm
Windowsのコピーコマンドはファイルの合併もできるらしいがUNIXのcpではできないので以下
#haribote.sys : asmhead.bin bootpack.hrb Makefile
# copy /B asmhead.bin+bootpack.hrb haribote.sys
haribote.sys : asmhead.bin bootpack.hrb Makefile
cat asmhead.bin bootpack.hrb > haribote.sys
runも書き換えなきゃならんらしいが、リモートログイン(CUI)したLinux上でqemuを使うつもりはないので試してはいない
#run :
# $(MAKE) img
# $(COPY) haribote.img ..¥z_tools¥qemu¥fdimage0.bin
# $(MAKE) -C ../z_tools/qemu
run :
../z_tools/make.exe img
qemu -m 32 -localtime -std-vga -fda haribote.img
run :
$(MAKE) img
qemu -m 32 -localtime -std-vga -fda haribote.img
パッチの作り方
diff -u だめなMakefile 正常なMakefile > パッチ.patch
patch -b パッチを当てたいMakefile パッチ.patch