BIOS 割り込みを使用してディスプレイにテキストを書き込む ASM コードを書き込もうとしています。このコードは、ブート セクタから実行されます。
私は持っている
msgText DB "Hello" ;Text
msgCol DB 0x07,0x08,0x09,0x0A,0x0B ;Colours
msgXY DW 0x0E26 ;Col/Row
msgLen DB 0x05 ;Length
メッセージは「Hello」だけで、文字の色がそれぞれ異なります。画面上のメッセージの位置はほぼ中央で、長さは 5 です。
メッセージ/色/xy/長さを画面に書き込む関数を書きたいのですが、今のところ、これに焦点を当てましょう。
print:
MOV AH,0x02 ;Tell BIOS we want to set the cursor position
MOV DX,[msgXY] ;Tell BIOS where the cursor should go
INT 0x10 ;Call BIOS video interrupt
XOR ECX,ECX ;Clear ECX
MOV CX,[msgLen] ;Set CX = msgLen
MOV AH,0x0E ;We want to print characters on the screen
_loop:
MOV EDX,msgText ;Move address of text to EDX
DEC ECX ;Temporarily decrement ECX
ADD EDX,ECX ;Add ECX to the address of msgText
INC ECX ;Increment ECX back to what it was
MOV AL,BYTE[EDX] ;Put the contents of the memory at EDX into AL
MOV EDX,msgCol ;Move address of text colour to EDX
DEC ECX ;Temporarily decrement ECX
ADD EDX,ECX ;Add ECX to the address of msgCol
INC ECX ;Increment ECX back to what it was
MOV BL,BYTE[EDX] ;Put the contents of the memory at EDX into BL
INT 0x10 ;Call BIOS video interrupt
LOOP _loop
RET
これで、これを で呼び出すことができるはずCALL print
です。
(はい、これが「Hello」を逆に出力することは知っています。それについては心配していません。「olleH」としてメモリに保存できます。気にしません。もっと大きな問題があります)
まず、設定した行が問題CX
を[msgLen]
引き起こします。CX
同等にするためにハードコードする必要が0x05
ありましたが、その理由はわかりません。
第二に、おそらく同じ理由で、カラーコードを設定しようとすると、テキストの長さと同じ問題が発生します。これらの行を削除してハードコードするだけMOV BL,0x0C
で、正常に動作します。
しかし、奇妙なことに、このMOV DX,[msgXY]
部分は正常に動作しているようです。
私は何時間もの間、多くのことを変更してこれを修正しようとしてきたため、正確な問題を示すことはできません. さらに、さまざまな BIOS 割り込みを呼び出すと、いくつかのレジスタが変更されるようで、非常に面倒です。また、何かをスタックにプッシュして、後でポップアウトするときも違うのでPUSH
、POP
完全に避けてきました。
ちなみに、この段階ではまだ x86 のリアル モードです。
確かに私がやっていることはそれほど難しいことではありません。多分私はコーヒーが必要です。それとも何かの助け?:)