ビデオバッファに移動して、白い背景に青い文字「D」を書き込もうとしています。このコードの何が問題になっていますか?
Irvine16.incを含める 。コード メインPROC mov ax、@ data mov ds、ax mov si、0b800h mov word ptr [si]、44h mov word ptr [si + 2] 0701h mov ah、08h int 21h 出口 メインENDP
上記に変更を加えました。これで組み立てられますが、何も表示されません。
サンプル例:
名前「hello-world」 org 100h ; ビデオモードを設定する mov ax、3; テキストモード80x25、16色、8ページ(ah = 0、al = 3) int 10h; やれ! ; 点滅をキャンセルし、16色すべてを有効にします。 mov ax、1003h mov bx、0 int 10h ; セグメントレジスタの設定: mov ax、0b800h mov ds、ax ; 「HelloWorld」を印刷する ; 最初のバイトはASCIIコード、2番目のバイトはカラーコードです。 mov [02h]、'h' mov [04h]、'e' mov [06h]、'l' mov [08h]、'l' mov [0ah]、'o' mov [0ch]、'、' mov [0eh]、'w' mov [10h]、'o' mov [12h]、'r' mov [14h]、'l' mov [16h]、'd' mov [18h]、'!' ; すべての文字に色を付ける: mov cx、12; 文字数。 mov di、03h; 'h'の後のバイトから開始 c:mov [di]、11101100b; 黄色(1110)に明るい赤(1100) di、2を追加します; vgaメモリ内の次のASCIIコードをスキップします。 ループc ; キーが押されるのを待ちます。 mov ah、0 int 16h ret
このサンプルがお役に立てば幸いです
0b800hは、ビデオバッファのセグメントアドレスです。-内のセグメントアドレスmov word ptr [si], 44h
のオフセット(ここでは0b800h)のみをアドレス指定し、ビデオバッファを指しません。ビデオセグメントをにロードし、セグメントオーバーライド()を使用することをお勧めします。DS
DS
ES
ES:
文字と色が一緒に単語を形成します。ビデオバッファには、最初に文字が表示され、次に色が表示されます。背景色と前景色はそれぞれニブル(4ビット)を使用します。「リトルエンディアン」(グーグル)のため、単語の形式は色/文字である必要があります(例:白/青/「D」= 7144h)。
これはIrvine16互換の例です。
INCLUDE Irvine16.inc
INCLUDELIB Irvine16.lib
.CODE
main PROC
; mov ax,@data ; No .DATA in this example
; mov ds,ax
mov si, 0b800h ; Initialize ES with video buffer
mov es, si
xor si, si ; Position 0 is top left
mov word ptr es:[si], 7144h ; White background ('7'), blue foreground (1), letter 'D' (44)
mov ah, 08h ; Wait for key - http://www.ctyme.com/intr/rb-2561.htm
int 21h
exit ; Irvine16: end of program
main ENDP
END main
ここでリスト15を見てください: