2017-02-16 4 views
0

Je baguette pour imprimer l'étoile autant que la valeur d'entrée de l'utilisateur mais quand j'imprime un retour à la ligne alors ma boucle ne fonctionne pas sans imprimer newline mon code fonctionne très bien. Pourquoi ça se passe je ne comprends pas.Si j'imprime newline alors ma boucle ne s'arrête pas

.model small 
.stack 100h 
.data 
    msg1 db "How many star do you want to print: $" 
    newline db 10,13,"$" 
.code 
    main proc 

    mov ax,@data 
    mov ds,ax 

    mov ah,9 
    lea dx,msg1 
    int 21h 

    mov ah,1 ;taking input number 
    int 21h 

    mov bl,al 
    sub al,48 

    ;if i add newline code here then my loop doesn't stop 

    ; mov ah,9 
    ; mov ah,newline 
    ; int 21h 

    loop: 
    mov cx,0 
    mov cl,al 
    mov ah,2 
    mov dl,'*' 

    Top: 
    int 21h 
    loop Top 


    Exit: 
    endp 
    end main 
+0

[int 21/ah = 9] (http: //www.ctyme.com/intr/rb-2562.htm) détruit le contenu de _AL_ –

+0

merci pour votre commentaire monsieur.But Comment puis-je me débarrasser de cela? –

+0

@WalidAlAshik Enregistrez le contenu de 'al' à l'avance et restaurez-le après l'interruption. – fuz

Répondre

1

L'instruction loop utilise registre cx pour compter et répéter le processus, de sorte que vous pouvez déplacer le nombre d'astérisque de al dans cl:

mov ah,1 ;taking input number 
int 21h 

xor cx,cx  ;◄■■ CLEAR CX. 
mov cl,al  ;◄■■ CX NOW HOLDS THE NUMBER OF ASTERISKS. 
sub cl,48 

;if i add newline code here then my loop doesn't stop 
    mov ah,9 
    lea dx,newline  ;◄■■ UNCOMMENT LINE BREAK. 
    int 21h 

loop: 
;mov cx,0  ;◄■■ HERE WE CANNOT CHANGE CX BECAUSE 
;mov cl,al  ;◄■■ IT IS THE COUNTER FOR THE LOOP. 
mov ah,2 
mov dl,'*' 

Top: 
int 21h 
loop Top  ;◄■■ CX--. IF CX>0 JUMP. 
+0

Merci beaucoup monsieur! Ça marche maintenant! –