なんか、とりあえず、あっさり実装出来たかな?と思ったら、
実機で動作確認してみたところ、OSが再ロードされちゃうみたい?
QEMUでは、上手く動いていた気がするんだけど、何でだろ?
とりあえず、手順を確認。
cmd_call: ; 変数領域確保 ; [BP-04] オフセット ; [BP-02] セグメント ; [BP+00] リターンアドレス PUSH BP MOV BP, SP SUB SP, 4
この辺は、C言語的に、スタック上に変数領域を確保しています。
; コールコマンド MOV SI, callmsg CALL puts
コマンド名、"CALL"を表示。
; セグメントアドレス入力 MOV SI, segmsg CALL puts MOV CX, 4 CALL gethex MOV [BP-2], AX ; セグメント←入力値
まず、"SEG? >"と表示して、16進数4桁の入力を求める。
入力された値は、セグメント値として、スタック上の変数領域に格納。
; オフセットアドレス入力 MOV SI, offmsg CALL puts MOV CX, 4 CALL gethex MOV [BP-4], AX ; オフセット←入力値
続けて、"OFF? ?"と表示して、同様に16進数4桁の入力を求める。
入力された値は、オフセット値として、スタック上の変数領域に格納。
; 初期値セット MOV ES, [BP-2] MOV BX, [BP-4]
セグメント値をESレジスタにセット。
オフセット値をBXレジスタにセット。
"CALL"コマンドでは、今のところ、ESレジスタは未使用。(^^;;;
将来、farコール用に使用する予定。
; 手続き呼び出し CALL BX
ここで、指定されたオフセット値を使用して、CALLを実行。
ただこれだけ。
CALL putcrlf
復帰後、一応、改行しておく。
cmd_call_end: ; 領域開放 MOV SP, BP POP BP RET
変数領域を開放して、呼び出し元に戻る。
う〜む。
ただ、もし、リセットが掛かったら、BIOS画面から表示される気がする。
ブートローダーからの再起動だから、BIOSがキャッチしている例外かな?
INT 19h が呼び出されているような気がするんだけど、
はてさて... 何でだろ???