diff --git a/U3L5/U3L5ES01.ASM b/U3L5/U3L5ES01.ASM index 2d7d5986cf373e9be8f67801baa34946253f577d..1cc2d23b453ecc17be80352fb0dd2eb450fe0d22 100644 --- a/U3L5/U3L5ES01.ASM +++ b/U3L5/U3L5ES01.ASM @@ -14,48 +14,48 @@ TITLE Esercizio n. 1 pag. 155 .MODEL SMALL .DATA - TERMINATORE EQU '@' - IND_INIZIALE EQU 0300h - + TERMINATORE EQU '@' + IND_INIZIALE EQU 0300h + .CODE - .STARTUP - ; Inserimento di alcuni dati di test a partire dall'indirizzo indicato - MOV BX, IND_INIZIALE - MOV BYTE PTR [BX], 010h - MOV BYTE PTR [BX+1], 0 - MOV BYTE PTR [BX+2], 015h - MOV BYTE PTR [BX+3], 020h - MOV BYTE PTR [BX+4], TERMINATORE - + .STARTUP + ; Inserimento di alcuni dati di test a partire dall'indirizzo indicato + MOV BX, IND_INIZIALE + MOV BYTE PTR [BX], 010h + MOV BYTE PTR [BX+1], 0 + MOV BYTE PTR [BX+2], 015h + MOV BYTE PTR [BX+3], 020h + MOV BYTE PTR [BX+4], TERMINATORE + LEGGI_CELLA: - MOV AL, [BX] ; Copia la cella di memoria puntata da BX nel registro AL - CMP AL, TERMINATORE - JE FINE ; Se AL = '@', il programma deve terminare - CMP AL, 0 - JE SUCCESSIVO ; Nessuna modifica se il valore del registro è zero + MOV AL, [BX] ; Copia la cella di memoria puntata da BX nel registro AL + CMP AL, TERMINATORE + JE FINE ; Se AL = '@', il programma deve terminare + CMP AL, 0 + JE SUCCESSIVO ; Nessuna modifica se il valore del registro è zero - ; Per sapere se un numero sia pari o dispari, e' sufficiente controllare il - ; suo bit lsb: se questo bit è 0, il numero e' pari, altrimenti e' dispari. - ; L'istruzione TEST BX, 1, tramite un'operazione interna di AND, imposta il - ; flag ZF a 0 se il bit lsb di BX e' zero, lo imposta a 1 se lsb è uno. - - TEST BX, 1 - JZ PARI - - ; L'indirizzo e' dispari, occorre incrementare il registro e memorizzarlo nella cella - INC AL - MOV [BX], AL - JMP SUCCESSIVO - + ; Per sapere se un numero sia pari o dispari, e' sufficiente controllare il + ; suo bit lsb: se questo bit è 0, il numero e' pari, altrimenti e' dispari. + ; L'istruzione TEST BX, 1, tramite un'operazione interna di AND, imposta il + ; flag ZF a 0 se il bit lsb di BX e' zero, lo imposta a 1 se lsb è uno. + + TEST BX, 1 + JZ PARI + + ; L'indirizzo e' dispari, occorre incrementare il registro e memorizzarlo nella cella + INC AL + MOV [BX], AL + JMP SUCCESSIVO + PARI: - ; L'indirizzo e' pari, si decrementa il valore - DEC AL - MOV [BX], AL - + ; L'indirizzo e' pari, si decrementa il valore + DEC AL + MOV [BX], AL + SUCCESSIVO: - INC BX ; BX punta ora alla cella successiva - JMP LEGGI_CELLA + INC BX ; BX punta ora alla cella successiva + JMP LEGGI_CELLA FINE: - .EXIT + .EXIT END diff --git a/U3L5/U3L5ES02.ASM b/U3L5/U3L5ES02.ASM index c8663dad25c926b6fd944b2f4923ffb07e6ec442..dfbfbc7dbcba5d21ec1b94d094d2055f236d28b1 100644 --- a/U3L5/U3L5ES02.ASM +++ b/U3L5/U3L5ES02.ASM @@ -14,43 +14,43 @@ TITLE Esercizio n. 2 pag. 155 .STACK .DATA - NUM_CELLE EQU 20 - IND_INIZIALE EQU 0100h - MINIMO EQU 020h - MASSIMO EQU 0A0h - - ; Inizializzazione di un buffer di 20 celle - - BUFFER DB 010h, 020h, 030h, 040h, 050h - DB 060h, 070h, 080h, 090h, 0A0h - DB 0B0h, 0C0h, 0D0h, 0E0h, 0F0h - DB 011h, 021h, 031h, 0A1h, 0B1h - + NUM_CELLE EQU 20 + IND_INIZIALE EQU 0100h + MINIMO EQU 020h + MASSIMO EQU 0A0h + + ; Inizializzazione di un buffer di 20 celle + + BUFFER DB 010h, 020h, 030h, 040h, 050h + DB 060h, 070h, 080h, 090h, 0A0h + DB 0B0h, 0C0h, 0D0h, 0E0h, 0F0h + DB 011h, 021h, 031h, 0A1h, 0B1h + .CODE - .STARTUP - MOV BX, IND_INIZIALE ; Indirizzo in cui trasferire il contenuto del buffer - MOV CX, NUM_CELLE ; Contatore di celle da elaborare - MOV SI, 0 - + .STARTUP + MOV BX, IND_INIZIALE ; Indirizzo in cui trasferire il contenuto del buffer + MOV CX, NUM_CELLE ; Contatore di celle da elaborare + MOV SI, 0 + LEGGI_CELLA: - MOV AL, BUFFER + SI - CMP AL, MINIMO - JB TRASFERIMENTO ; Se AL è minore del valore minimo, lo si trasferisce in memoria - CMP AL, MASSIMO - JA TRASFERIMENTO ; e anche se AL è maggiore del valore massimo - - ; Il valore del registro non soddisfa i requisiti del problema, non si procede al - ; trasferimento in memoria e si passa al dato successivo - JMP SUCCESSIVO - + MOV AL, BUFFER + SI + CMP AL, MINIMO + JB TRASFERIMENTO ; Se AL è minore del valore minimo, lo si trasferisce in memoria + CMP AL, MASSIMO + JA TRASFERIMENTO ; e anche se AL è maggiore del valore massimo + + ; Il valore del registro non soddisfa i requisiti del problema, non si procede al + ; trasferimento in memoria e si passa al dato successivo + JMP SUCCESSIVO + TRASFERIMENTO: - MOV [BX], AL - INC BX + MOV [BX], AL + INC BX SUCCESSIVO: - INC SI - DEC CX - JNZ LEGGI_CELLA + INC SI + DEC CX + JNZ LEGGI_CELLA FINE: - .EXIT + .EXIT END diff --git a/U3L5/U3L5ES03.ASM b/U3L5/U3L5ES03.ASM index be972b496c56b717adb2b132955ac7b2d84d333b..810b337250ba8e2485e831554bc144d71b55e5b4 100644 --- a/U3L5/U3L5ES03.ASM +++ b/U3L5/U3L5ES03.ASM @@ -15,38 +15,38 @@ TITLE Esercizio n. 3 pag. 155 .STACK .DATA - NUM_CELLE EQU 10 - IND_INIZIALE EQU 0100h - MINIMO EQU 0D000h - MASSIMO EQU 0F000h - - ; Inizializzazione di un buffer di 10 word - - BUFFER DW 01000h, 04000h, 08000h, 0B000h, 0D000h - DW 0E000h, 0F000h, 0FFFFh, 00000h, 0D001h - + NUM_CELLE EQU 10 + IND_INIZIALE EQU 0100h + MINIMO EQU 0D000h + MASSIMO EQU 0F000h + + ; Inizializzazione di un buffer di 10 word + + BUFFER DW 01000h, 04000h, 08000h, 0B000h, 0D000h + DW 0E000h, 0F000h, 0FFFFh, 00000h, 0D001h + .CODE - .STARTUP - MOV BX, IND_INIZIALE ; Indirizzo in cui trasferire il contenuto del buffer - MOV CX, NUM_CELLE ; Contatore di celle da elaborare - MOV SI, 0 - + .STARTUP + MOV BX, IND_INIZIALE ; Indirizzo in cui trasferire il contenuto del buffer + MOV CX, NUM_CELLE ; Contatore di celle da elaborare + MOV SI, 0 + LEGGI_CELLA: - MOV AX, BUFFER + SI - CMP AX, MINIMO - JB SUCCESSIVO ; Se AX è minore del valore minimo, si passa al valore successivo - CMP AX, MASSIMO - JA SUCCESSIVO ; e anche se AX è maggiore del valore massimo - - ; Il valore del registro soddisfa i requisiti del problema, si procede al - ; trasferimento in memoria e si passa al dato successivo - MOV [BX], AX - ADD BX, 2 + MOV AX, BUFFER + SI + CMP AX, MINIMO + JB SUCCESSIVO ; Se AX è minore del valore minimo, si passa al valore successivo + CMP AX, MASSIMO + JA SUCCESSIVO ; e anche se AX è maggiore del valore massimo + + ; Il valore del registro soddisfa i requisiti del problema, si procede al + ; trasferimento in memoria e si passa al dato successivo + MOV [BX], AX + ADD BX, 2 SUCCESSIVO: - ADD SI, 2 - DEC CX - JNZ LEGGI_CELLA + ADD SI, 2 + DEC CX + JNZ LEGGI_CELLA FINE: - .EXIT + .EXIT END diff --git a/U3L5/U3L5ES04.ASM b/U3L5/U3L5ES04.ASM index a1520aa8d39d6e72241641c83fc1ff7c1a12fc32..c8e2d8a79c39c6e2f7e3d7b3fe0ed6f494f61667 100644 --- a/U3L5/U3L5ES04.ASM +++ b/U3L5/U3L5ES04.ASM @@ -17,48 +17,48 @@ TITLE Esercizio n. 4 pag. 155 .STACK .DATA - NUM_CELLE EQU 5 - IND_INIZIALE EQU 0100h - + NUM_CELLE EQU 5 + IND_INIZIALE EQU 0100h + .CODE - .STARTUP - ; Inizializzazione di quattro word senza segno in memoria a partire dall'indirizzo indicato - MOV BX, IND_INIZIALE - MOV WORD PTR [BX], 0A00h - MOV WORD PTR [BX+2], 0FFF0h - MOV WORD PTR [BX+4], 04CA0h - MOV WORD PTR [BX+6], 0FFFFh - MOV WORD PTR [BX+8], 0ABCDh - ; Memorizzazione del numero di word da elaborare - MOV BYTE PTR [BX-1], NUM_CELLE - - ; Acquisizione del numero di celle da elaborare - MOV BX, IND_INIZIALE - MOV CL, [BX-1] - + .STARTUP + ; Inizializzazione di quattro word senza segno in memoria a partire dall'indirizzo indicato + MOV BX, IND_INIZIALE + MOV WORD PTR [BX], 0A00h + MOV WORD PTR [BX+2], 0FFF0h + MOV WORD PTR [BX+4], 04CA0h + MOV WORD PTR [BX+6], 0FFFFh + MOV WORD PTR [BX+8], 0ABCDh + ; Memorizzazione del numero di word da elaborare + MOV BYTE PTR [BX-1], NUM_CELLE + + ; Acquisizione del numero di celle da elaborare + MOV BX, IND_INIZIALE + MOV CL, [BX-1] + INIZIO: - CMP CL, 0 - JE FINE - ; Riconoscimento dell'indirizzo multiplo di tre - MOV AX, BX ; Caricamento dell'indirizzo da analizzare in AX - MOV DL, 3 - DIV DL ; Divide AX per DL -> Quoziente in AL, Resto in AH - CMP AH, 0 - JE MULTIPLO3 - ; L'indirizzo non e' multiplo di 3, si azzera la word - MOV WORD PTR [BX], 0 - JMP SUCCESSIVO - + CMP CL, 0 + JE FINE + ; Riconoscimento dell'indirizzo multiplo di tre + MOV AX, BX ; Caricamento dell'indirizzo da analizzare in AX + MOV DL, 3 + DIV DL ; Divide AX per DL -> Quoziente in AL, Resto in AH + CMP AH, 0 + JE MULTIPLO3 + ; L'indirizzo non e' multiplo di 3, si azzera la word + MOV WORD PTR [BX], 0 + JMP SUCCESSIVO + MULTIPLO3: - MOV AX, [BX] ; Carica la word puntata da BX nel registro AX - ADD AX, 020h ; Addizione con operandi considerati senza segno - JC SUCCESSIVO ; Se l'addizione produce un riporto, la cella non deve essere modificata - MOV [BX], AX ; Aggiornamento della word in memoria + MOV AX, [BX] ; Carica la word puntata da BX nel registro AX + ADD AX, 020h ; Addizione con operandi considerati senza segno + JC SUCCESSIVO ; Se l'addizione produce un riporto, la cella non deve essere modificata + MOV [BX], AX ; Aggiornamento della word in memoria SUCCESSIVO: - ADD BX, 2 ; Spostiamo il puntatore alla word successiva - DEC CL ; Decrementiamo il contatore di word da elaborare - JMP INIZIO + ADD BX, 2 ; Spostiamo il puntatore alla word successiva + DEC CL ; Decrementiamo il contatore di word da elaborare + JMP INIZIO FINE: - .EXIT + .EXIT END diff --git a/U3L5/U3L5ES08.ASM b/U3L5/U3L5ES08.ASM index 9206576a9ee7d1031de01d8dd5b7d3870dbfb44e..3f49e6821849e25869391dbae414086b29526691 100644 --- a/U3L5/U3L5ES08.ASM +++ b/U3L5/U3L5ES08.ASM @@ -14,45 +14,44 @@ TITLE Esercizio n. 8 pag. 155 .STACK .DATA - NUM_CELLE EQU 10 - IND_INIZIALE EQU 0100h - + NUM_CELLE EQU 10 + IND_INIZIALE EQU 0100h + .CODE - .STARTUP - ; Inizializzazione dell'area di memoria (numeri interi segna segno) - MOV BX, IND_INIZIALE - MOV BYTE PTR [BX], 010h - MOV BYTE PTR [BX+1], 020h - MOV BYTE PTR [BX+2], 030h - MOV BYTE PTR [BX+3], 040h - MOV BYTE PTR [BX+4], 011h - MOV BYTE PTR [BX+5], 021h - MOV BYTE PTR [BX+6], 031h - MOV BYTE PTR [BX+7], 041h - MOV BYTE PTR [BX+8], 012h - MOV BYTE PTR [BX+9], 022h - - - MOV BX, IND_INIZIALE - MOV CX, NUM_CELLE - MOV DL, 0 ; Contiene il valore massimo temporaneo - + .STARTUP + ; Inizializzazione dell'area di memoria (numeri interi segna segno) + MOV BX, IND_INIZIALE + MOV BYTE PTR [BX], 010h + MOV BYTE PTR [BX+1], 020h + MOV BYTE PTR [BX+2], 030h + MOV BYTE PTR [BX+3], 040h + MOV BYTE PTR [BX+4], 011h + MOV BYTE PTR [BX+5], 021h + MOV BYTE PTR [BX+6], 031h + MOV BYTE PTR [BX+7], 041h + MOV BYTE PTR [BX+8], 012h + MOV BYTE PTR [BX+9], 022h + + MOV BX, IND_INIZIALE + MOV CX, NUM_CELLE + MOV DL, 0 ; Contiene il valore massimo temporaneo + LEGGI_CELLA: - MOV AL, [BX] ; Caricamento del byte da analizzare in AL - CMP AL, DL ; Confronto con il massimo temporaneo - JBE SUCCESSIVO ; Se AL non è piu' grande di DL, si passa al dato successivo - - ; In AL e' presente un nuovo massimo temporaneo, si aggiorna DL - MOV DL, AL + MOV AL, [BX] ; Caricamento del byte da analizzare in AL + CMP AL, DL ; Confronto con il massimo temporaneo + JBE SUCCESSIVO ; Se AL non è piu' grande di DL, si passa al dato successivo + + ; In AL e' presente un nuovo massimo temporaneo, si aggiorna DL + MOV DL, AL SUCCESSIVO: - INC BX ; Passaggio alla cella successiva - DEC CX - JNE LEGGI_CELLA - + INC BX ; Passaggio alla cella successiva + DEC CX + JNE LEGGI_CELLA + FINE: ; Prima di finire, si memorizza il valore massimo nella cella 010Ah - ; Si noti che, alla fine del ciclo, questo indirizzo e' gia' contenuto in BX - MOV [BX], DL - .EXIT + ; Si noti che, alla fine del ciclo, questo indirizzo e' gia' contenuto in BX + MOV [BX], DL + .EXIT END diff --git a/U3L5/U3L5ES18.ASM b/U3L5/U3L5ES18.ASM index 154080411917baed0ab9b8a1aa079ad41498dbc1..7ed7b66aa71c70c73a25c8c4198c5f5f63db674e 100644 --- a/U3L5/U3L5ES18.ASM +++ b/U3L5/U3L5ES18.ASM @@ -16,49 +16,50 @@ TITLE Esercizio n. 18 pag. 155 .STACK .DATA - IND_INIZIALE EQU 0100h - + IND_INIZIALE EQU 0100h + .CODE - .STARTUP - ; Il risultato dell'elaborazione sara' memorizzato nel registro DL secondo - ; la seguente convezione: - ; DL = 0 -> stringa non palindroma - ; DL = 1 -> stringa palindroma - MOV DL, 0 ; All'inizio si suppone che la stringa non sia palindroma - - ; Copia la stringa nell'area di memoria a partire dall'indirizzo indicato - MOV BX, IND_INIZIALE - MOV BYTE PTR [BX], 'o' - MOV BYTE PTR [BX+1], 'r' - MOV BYTE PTR [BX+2], 't' - MOV BYTE PTR [BX+3], 'o' - MOV BYTE PTR [BX+4], '$' + .STARTUP + ; Il risultato dell'elaborazione sara' memorizzato nel registro DL secondo + ; la seguente convezione: + ; DL = 0 -> stringa non palindroma + ; DL = 1 -> stringa palindroma + + MOV DL, 0 ; All'inizio si suppone che la stringa non sia palindroma + + ; Copia la stringa nell'area di memoria a partire dall'indirizzo indicato + MOV BX, IND_INIZIALE + MOV BYTE PTR [BX], 'o' + MOV BYTE PTR [BX+1], 'r' + MOV BYTE PTR [BX+2], 't' + MOV BYTE PTR [BX+3], 'o' + MOV BYTE PTR [BX+4], '$' - ; Posizionamento del registro indice DI sull'ultimo carattere della stringa - MOV DI, 0 + ; Posizionamento del registro indice DI sull'ultimo carattere della stringa + MOV DI, 0 RICERCA: - CMP BYTE PTR [BX+DI], '$' - JE FINERICERCA - INC DI - JMP RICERCA - + CMP BYTE PTR [BX+DI], '$' + JE FINERICERCA + INC DI + JMP RICERCA + FINERICERCA: - DEC DI ; Indice dell'ultimo carattere - MOV SI, 0 ; Indice del primo carattere - + DEC DI ; Indice dell'ultimo carattere + MOV SI, 0 ; Indice del primo carattere + CONTROLLO: - CMP SI, DI - JA PALINDROMA ; Se l'indice SI ha oltrepassato DI, la stringa e' palindroma - MOV AL, [BX+SI] - CMP AL, [BX+DI] - JNE FINE ; Se [BX+SI] e [BX+DI] sono diversi, il programma finisce (non palindroma) - INC SI - DEC DI - JMP CONTROLLO - + CMP SI, DI + JA PALINDROMA ; Se l'indice SI ha oltrepassato DI, la stringa e' palindroma + MOV AL, [BX+SI] + CMP AL, [BX+DI] + JNE FINE ; Se [BX+SI] e [BX+DI] sono diversi, il programma finisce (non palindroma) + INC SI + DEC DI + JMP CONTROLLO + PALINDROMA: - MOV DL, 1 + MOV DL, 1 FINE: - ; Osservare il valore del registro DL - .EXIT + ; Osservare il valore del registro DL + .EXIT END