x86 アセンブリ言語の簡単なプログラムがあります。OSなしでビデオメモリに文字列を直接出力する必要があります。
[bits 16]
[org 0x7c00]
mov ax, 0x3
int 0x10
sdl
mov ax, 0xb800
mov es,ax
mov si, msg
xor di, di
repnz movsw
jmp $
msg db 'Hello'
times 510 - ($ - $$) db 0
dw 0xaa55
しかし、うまくいきません。手伝って頂けますか?
x86 アセンブリ言語の簡単なプログラムがあります。OSなしでビデオメモリに文字列を直接出力する必要があります。
[bits 16]
[org 0x7c00]
mov ax, 0x3
int 0x10
sdl
mov ax, 0xb800
mov es,ax
mov si, msg
xor di, di
repnz movsw
jmp $
msg db 'Hello'
times 510 - ($ - $$) db 0
dw 0xaa55
しかし、うまくいきません。手伝って頂けますか?
いくつかの問題があります:
などの指示はありませんsdl。
データをコピーするにはrep movsw、 ではなくを使用する必要がありますrepnz movsw。
cxの前に設定する必要がありますrep movsw。
各文字の色も、ビデオ メモリの 1 バイトおきに、 でコピーされるデータrep movsw内、またはコピー ループ内で定義する必要があります。以下のコードは、両方のオプションを示しています。
編集:コードを追加しました。
[ビット 16]
[組織 0x7c00]
ムーブアックス、3
整数 10h
プッシュワード 0xb800
ポップエス
cs を押します。念のため、ブートローダ コードについては、
ポップDS; movsb に必要
xor di,di
mov si,msg
mov cx,msg_length_in_bytes
one_color_copy_to_vram_loop:
movsb
移動,0x0f
ストーブ
ループ one_color_copy_to_vram_loop
mov si,multicolor_msg
mov cx,multicolor_msg_length
担当者movsw
ジャンプ $
msg db 'こんにちは'
msg_length_in_bytes equ $-msg
multicolor_msg データベース ' ',0
デシベル 'H',1
データベース 'e',2
データベース 'l',3
データベース 'l',4
デシベル 'o',5
デシベル ' ',0
デシベル 'w',6
データベース「私」、7
デシベル 't',8
デシベル 'h',9
デシベル ' ',0
データベース 'c',10
デシベル 'o',11
データベース 'l',12
デシベル 'o',13
データベース 'r',14
デシベル '!',15
multicolor_msg_length equ ($-multicolor_msg)/2
repnzプレフィックスを使用すると、最初にcxレジスタを文字数に設定する必要があります.nrzが指摘するように、ゼロに遭遇すると停止するため、そのレジスタを使用しないでください.