2016-08-03 3 views
0

J'utilise l'assemblage 16 bits pour créer un programme DOS à des fins éducatives sur la façon de programmer VGA, j'ai écrit un code pour écrire la couleur de certains pixels, les caractères d'une chaîne, le code allé bien avec changer la couleur des pixels, mais lorsque je tente d'imprimer la chaîne, il imprime des caractères étranges, allot d'entre eux J'utilise MASM 5.00 et Link 3,60 et en cours d'exécution sur DOSBoxMon code imprime la poubelle au lieu du texte désiré

C'est mon code

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

Je viens de rencontrer votre code et il a bien fonctionné pour moi. Essayez d'initialiser le segment de données manuellement, insérez les deux lignes immédiatement après '.code':' mov ax, @ data mov ds, ax'. –

+0

@ JoseManuelAbarcaRodríguez j'ai totalement oublié d'initialiser le segment de données, et ce fut l'erreur, merci pour avis – Kordy

+1

"Aucune idée" devinez: vous utilisez DOS 21h en mode graphique, peut-être votre dosbox + DOS a des problèmes pour afficher les caractères en mode gfx ? Pouvez-vous essayer de sortir du char avec int 10h ah, 9? Il en résultera probablement la même chose, mais juste pour être sûr. (Je pense que le 21h appelle le 10h de toute façon, donc ne vous attendez pas à un miracle) BTW 'mov ax, 0' mov al, 013h' = vous savez que cela peut être fait avec single' mov ax, 13h'? Sinon, essayez de relire ce qui est 'ax' et' al'. (EDIT: oh, ce 'ds' est très probablement le problème). – Ped7g

Répondre

1

Je viens de lancer votre code et ça a bien fonctionné pour moi. Essayez d'initialiser le segment de données manuellement, insérez deux lignes suivantes immédiatement après .code:

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

Quelqu'un m'a suggéré que mon commentaire était mieux comme réponse. –