試行錯誤してみる
; 手続き呼び出し CALL BX
とりあえず、ここが怪しい... と思われる。
試しに、
; 手続き呼び出し CALL puts
としてみる。
これだと、相対CALLだけど、これでも動かなければ、原因は別にあるはず。
結果 → (予想通り)動いた
じゃ、次に、
MOV BX, puts MOV AX, BX CALL puthex CALL putcrlf CALL BX
ちょっと、無駄な事をやっている感じだけど、
とりあえず、レジスタの内容をチェックしたいので、こんな形になった。
puthexは、AXレジスタの内容を16進表記で出力するサブルーチン。
MOV AX, puts として、CALL AX とすれば、MOV AX, BX が不要になるんだけど、
オフセット値をBXレジスタに設定するのは、他のコマンドと同じにしたいので、
BXレジスタにこだわってみた。
もしかしたら、BXレジスタを使っているので、ダメなのかもしれないし。
結果 → 落ちた!!
う〜ん。
これまた、QEMUでは、イメージ通りに動いているんだけどなぁ...
じゃ、更に、
MOV BX, puts MOV AX, BX CALL puthex CALL putcrlf CALL AX
レジスタとしてAXレジスタを使ってみる。
これでダメなら、CALL レジスタ の使い方を間違っているかも?
当然だが... QEMUでは、問題なく動いている。
さて... 実機ではどうかな?
結果 → 落ちた!!
まぢですか!!
あれれ?
やっぱり、CALL レジスタ の使い方を間違っているのかなぁ?
それにしても、QEMUで動いちゃうってのも、どうなのよ???
何か、根本的に間違っている気がしてきたなぁ...
落ち着いて、もう少し、調査してみよう。