Esercizio 5
Spesso gli algoritmi contengono sequenze di istruzioni che devono essere
ripetute tante volte di seguito: queste strutture sono si chiamano cicli.
Nel linguaggio assembly sono rappresentate dalla struttura LOOP che ha la
seguente sintassi:
MOV CX, contatore
TARGET: istruzione A
istruzione B
. . . .
istruzione n
LOOP TARGET
La tabella illustra l'uso dell'istruzione LOOP.
Codice mnemonico | Azione |
LOOP | CX=CX-1 se CX!=0 allora salta al TARGET
altrimenti passa all'istruzione successiva |
LOOPE | CX=CX-1 se CX!=0 e ZF=1 allora salta al TARGET
altrimenti continua |
LOOPNE | CX=CX-1 se CX!=0 e ZF=0 allora salta al TARGET altrimenti continua |
CX è il registro contatore e ZF il flag di zero. Nell'istruzione si osserva
che il registro CX è sempre coinvolto; esso viene inizializzato al numero
di volte che le istruzioni devono essere ripetute. Bisogna poi specificare
che è buona norma azzerare tale registro con l'istruzione
SUB CX,CX
per essere sicuri che anche CH sia zero, infatti se il numero di ripetizioni
fosse inferiore a 255 basterebbe CL e valori indesiderati in CH causerebbero
malfunzionamenti, mentre se le ripetizioni fossero al massimo 65536 occorre
anche CH.
Nelle istruzioni LOOPE e LOOPNE il registro CX contiene il numero massimo
di volte che le istruzioni devono essere ripetute, la ripetizione dipende
anche dall'istruzione immediatamente precedente a LOOP che modifica il flag
di zero. Per questo motivo esiste l'istruzione di salto condizionato JCXZ
che consente di conoscere il motivo dell'uscita dal ciclo quando si usa
LOOPE e LOOPNE .
TITLE CINQUE
;prodotto di due numeri
.MODEL SMALL
.STACK
.DATA
OP1 DB 8
OP2 DB 7
.CODE
MOV AX,@DATA
MOV DS,AX
SUB CX,CX
MOV CL,OP1
SUB AX,AX
CICLO: ADD AL,OP2
ADC AH,0
LOOP CICLO
CALL TRAD
MOV AX,4C00H
INT 21H
TRAD PROC NEAR
MOV CL,10
DIV CL;divido AL per il valore di CL=10
;il quoto della divisione va il AL, il resto va in AH
PUSH AX
CMP AL,0
JE SALTA
ADD AL,48 ; stampa del quoto
MOV AH,02
MOV DL,AL
INT 21H
SALTA: POP AX
XCHG AL,AH ; scambio il contenuto dei due registri
ADD AL,48 ; stampa del resto
MOV AH,02
MOV DL,AL
INT 21H
RET TRAD
ENDP
END
Nel nostro codice il registro CX viene impostato ad OP1=8 e decrementato
fino a zero, esegue dunque 8 iterazioni durante ognuna delle quali il registro
AL viene incrementato del secondo operando OP2.