Ciclo

di il
6 risposte

Ciclo

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

  • Re: Ciclo

    Che emulatore usi?
    e che errore ti da?
    comunque a posta dell Add usa la inc
  • Re: Ciclo

    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
  • Re: Ciclo

    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!
  • Re: Ciclo

    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.
  • Re: Ciclo

    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
  • Re: Ciclo

    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