edutecnica

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.