Ciclo

di daiazu il
6 risposte
Il codice seguente invece di visualizzare 5 cuori sul monitor va subito alla fine. Perchè?
;visualizza sullo schermo 5 cuori in orizzontale (03H)
.MODEL SMALL
.STACK 100H
.DATA
A DB 5
C DB 1
.STARTUP
.CODE
inizio_ciclo:
CMP C,5
JG fine
MOV DL, 03H ; codice ascci del cuore
MOV AH, 02H
INT 21H
ADD C, 1
JMP inizio_ciclo:

fine:

MOV AH, 4CH
INT 21H
END

6 Risposte

  • Che emulatore usi?
    e che errore ti da?
    comunque a posta dell Add usa la inc
  • Non so quale assembler usi, ma MASM non riconosce C come variabile valida. Questa versione assembla bene e si vedono cinque cuoricini nella console. Come si manifesta il tuo problema? Il file exe viene creato, si lancia ma non funziona?
    .MODEL SMALL
    option casemap:none
    .486
    .stack 1024
    .DATA
    A DB 5
    xC DB 1
    .CODE
    .STARTUP
    inizio_ciclo:
    CMP xC,5
    JG fine
    MOV DL, 03H ; codice ascci del cuore
    MOV AH, 02H
    INT 21H
    ADD xC, 1
    JMP inizio_ciclo
    
    fine:
    
    MOV AH, 4CH
    INT 21H
    END
  • Ciao comunque nel tuo esempio le variabili non servono!
    nel tuo esempio non assegnavi al registro ds il segmento data (dove ci sono le variabili)
    avresti dovuto mettere mov ds,@data subito dopo .startup
    
    mov cx,5
    inizio_ciclo:
    MOV DL, 03H ; codice ascci del cuore
    MOV AH, 02H
    INT 21H
    loop inizio_ciclo
    
    comunque l' istruzione loop l'hanno creata a posta per gestire i ciccli!
    essa termina quando cx=0 fa il conto alla rovescia!
  • Ecco il codice completo con le proposte di smalldragon:
    .model small
    .486
    .stack 1024
    
    .code
    mov cx, 50	; numero desiderato
    
    inizio_ciclo:
      mov dl, 03h	; codice ASCII del cuore
      mov ah, 02h
      int 21h
    loop inizio_ciclo
    
    fine:
    mov ah, 4ch
    int 21h
    end
    Nota bene, però, che usare ecx per un loop che contiene un "print" in un programma 32-bit creerebbe problemi seri.
  • Lo stack non serve!

    jj2007 ha scritto:


    Nota bene, però, che usare ecx per un loop che contiene un "print" in un programma 32-bit creerebbe problemi seri.
    Basta fare:
    
    ciclo_stampa:
    push ecx
    ; tutte le push per la print o per la cout
    call print ; oppure call cout
    pop ecx 
    loop ciclo_stampa
    
    e il problema è risolto.
    fagli fare un pò di esperienza prima con il codice a 16 bit
  • Se non metti lo stack, il linker si lamenta: warning L4021: no stack segment
    push & pop [e]cx vanno bene, certo, ma è sempre utile ricordarsi che valgono certe regole per la preservazione di registri, vedi
Devi accedere o registrarti per scrivere nel forum
6 risposte