2016-08-03 4 views
0

私は16ビットアセンブリを使用してVGAプログラムの教育目的でDOSプログラムを作成しています。色を書き込むコードを書きました。ピクセルの色を変えると良いなくなって、私は、文字列を印刷しようとすると、これは私のコード私のコードが目的のテキストの代わりにガベージを印刷します

であるそれらのアロット 私はMASM 5.00とリンク3.60を使用していますし、DOSBoxを

上で実行されている、変な文字を印刷します

org 100h 
.model small 
.stack 100h 
.data 
msg   db  'Hello VGA','$' 
.code 
main proc 
mov ax, 0         
mov al, 013h        
int 10h 

mov ah, 02h         ;function code for setting cursor pos. 
mov bh, 0         ;setting page number 
mov dx, 0         ;setting dh, dl to row and column 
int 10h 

mov ah, 0ch         
mov al, 00001110b      
mov cx, -1 

ploop: 
inc cx           ;x point pos. 
mov dx, 0         ;y point pos. 
int 10h 
cmp cx, 9919 
jne ploop 
;keyboard services 

mov ah, 00h         ;read key function code 
int 16h    

;set cursor position 
mov ah, 02h 
mov bh, 0          ;Display page 
mov dh, 04h         ;Row 
mov dl, 00h         ;Column 
int 10h 

;print msg 
mov ah, 09h 
lea dx, msg 
int 21h 
mov ax, 4c00h 
int 21h 
main endp 
     end main 
+5

私はちょうどあなたのコードを実行し、それは私にはうまく働きました。データセグメントを手動で初期化して、 '.code'の直後に次の2行を挿入してください:' mov ax、@ data mov ds、ax'。 –

+0

@JoseManuelAbarcaRodríguez私は完全にデータセグメントを初期化することを忘れていましたが、それはエラーでした。通知のためにありがとう – Kordy

+1

"いいえアイデア"推測:DOSモードで21hを使用しています。 ?あなたint 10hああ、9でいくつかの文字を出力しようとすることができますか?おそらく同じことが起こりますが、確かにそうです。 (私は21hはとにかく10hと呼んでいると思うので、奇跡は期待しないでください)BTW 'mov ax、0'' mov al、013h' =これは単一の 'mov ax、13h'でできます。もしそうでなければ、 'ax'と' al'を読み直してみてください。 (編集:ああ、その 'ds'は非常に問題の可能性が高い)。 – Ped7g

答えて

1

私はちょうどあなたのコードを実行し、それは私にうまく働いた。すぐ.code後に次の2行を挿入し、手動でデータセグメントを初期化してみてください。

.code 
    mov ax, @data 
    mov ds, ax 
    . 
    . 
    . 
+0

誰かが私のコメントが答えとして良いと私に示唆しました。 –

関連する問題