例外発生?リセットされた?

なんか、とりあえず、あっさり実装出来たかな?と思ったら、
実機で動作確認してみたところ、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 が呼び出されているような気がするんだけど、
はてさて... 何でだろ???