4

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

しかし、うまくいきません。手伝って頂けますか?

4

2 に答える 2

4

いくつかの問題があります:

  1. などの指示はありませんsdl

  2. データをコピーするにはrep movsw、 ではなくを使用する必要がありますrepnz movsw

  3. cxの前に設定する必要がありますrep movsw

  4. 各文字の色も、ビデオ メモリの 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
于 2013-03-17T17:02:25.267 に答える
0

repnzプレフィックスを使用すると、最初にcxレジスタを文字数に設定する必要があります.nrzが指摘するように、ゼロに遭遇すると停止するため、そのレジスタを使用しないでください.

于 2013-03-17T17:00:07.213 に答える