Vari e semplici programmi. Programmi in Assembly 8086 Vari e semplici programmi.
Programma scambia il valore tra 2 variabili TITLE scambia .MODEL SMALL .STACK .DATA primo DB 01h ; variabile con assegnazione valore secondo DB 02h ; variabile con assegnazione valore .CODE .STARTUP MOV AL, primo ; sposta la prima variabile nel registro AL MOV AH, secondo ; sposta la seconda variabile nel registro AH MOV primo, AH ; sposta il contenuto del registro AH nella prima variabile MOV secondo, AL ; sposta il contenuto del registro AL nella seconda variabile MOV AL, 00h ; funzione di ritorno MOV AH, 4Ch ; al sistema operativo INT 21h END
Programma che esegue la somma tra 2 variabili TITLE Somma2numeri .MODEL small .STACK .DATA OP1 DB 11 ; variabile con assegnazione valore OP2 DB 7 ; variabile con assegnazione valore RIS DB ? ; variabile per risultato senza assegnazione valore .CODE .STARTUP MOV AL, OP1 ; sposta la prima variabile nel registro AL ADD AL, OP2 ; esegue la somma MOV RIS, AL ; sposta/memorizza il risultato in RIS MOV AH,4Ch ; in alternativa alla funzione 4Ch di INT 21h INT 21h ; si potrebbe usare la direttiva - .EXIT END
Programma che esegue la moltiplicazione tra 2 variabili TITLE Moltiplicazione2numeri .MODEL small .STACK .DATA OP1 DB 7 ; variabile con assegnazione valore OP2 DB 6 ; variabile con assegnazione valore RIS DW ? ; variabile risultato, a 16 bit, senza assegnazione valore .CODE .STARTUP MOV AL, OP1 ; sposta la prima variabile nel registro AL perché è quello dedicato MUL OP2 ; esegue la Moltiplicazione, tra OP2 e quello che è presente in AL MOV RIS, AX ; sposta il risultato presente in AX nella variabile RIS .EXIT END
Programma che esegue la divisione tra 2 variabili TITLE Divisione2numeri .MODEL small .STACK .DATA Dividendo DB 12 ; variabile con assegnazione valore Divisore DB 6 ; variabile con assegnazione valore Quoziente DB ? ; variabile senza assegnazione valore Resto DB ? ; variabile senza assegnazione valore .CODE .STARTUP MOV AH, 00D ; azzera AH MOV AL, Dividendo ; sposta il dividendo nel registro AL DIV Divisore ; esegue la divisione, tra quello che è presente in AX e la variabile Divisore MOV Quoziente, AL ; sposta/memorizza in Quoziente il contenuto di AL MOV Resto, AH ; sposta/memorizza in Resto il contenuto di AH .EXIT END
Programma che esegue la somma dei valori presente nel vettore VET TITLE SommanumeriVet DIM EQU 10 ; DIM è dichiarata come costante .MODEL small .STACK .DATA VET DB 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 ; dichiarazione e valori caricati nel vettore SOMMA DB ? .CODE .STARTUP MOV AL, 0 ; inizializza a 0 il registro AL MOV CL, DIM ; carica in CL la dimensione del vettore MOV DI, 0 ; azzera il registro DI, registro indice destinazione Ciclo: ; etichetta ADD AL, VET[DI] ; somma in AL l'elemento corrispondente a VET indicato da DI ADD DI, 1 ; incrementa DI puntando all'elemento successivo DEC CL ; decrementa il contatore CMP CL, 0 ; confronta il contatore CL con zero(0) JNZ Ciclo ; se CL è a zero termina, altrimenti ripete il ciclo MOV SOMMA, AL ; sposta/memorizzo il risultato in SOMMA .EXIT END
Programma che richiede in input un numero da tastiera, e stampa a video l’equivalente in ♥ TITLE Stampa_cuori .MODEL small .STACK .DATA NUM DB ? ; variabile MESSAGE DB 'INSERISCI UN NUMERO : ','$' .CODE MOV AX,@DATA ; blocco di istruzioni MOV DS,AX ; che servono MOV DX,OFFSET MESSAGE ; per stampare a MOV AH,9D ; video il messaggio INT 21H MOV AH, 1D ; funzione per l’input da INT 21H ; tastiera del numero SUB AL,48 ; sottrae lo 0 ASCII per determinare il valore. CMP AL,0 ; confronto AL (il valore) con 0 JE FINE ; se il valore è uguale a zero salta a l’etichetta FINE Continua => => Continua MOV CH,0 ; azzera CH MOV CL,AL ; sposta il valore in CL, (CX) MOV DL,10D ; inserisco il codice ASCII 10D per spostare MOV AH,2D ; il cursore ad inizio riga. INT 21H MOV DL,13D ; inserisco il codice ASCII 13D per spostare MOV AH,2D ; il cursore giù di una linea. STAMPA: ; etichetta del ciclo LOOP MOV DL,03D ; inserisco il codice ASCII 03D (♥) MOV AH,2D ; funzione di stampa, visualizza il cuore ♥ LOOP STAMPA ; il LOOP decrementa automaticamente ; il registro contatore CX FINE: .EXIT
Programma che esegue la somma tra 2 numeri inseriti da tastiera TITLE Somma_num_inseriti .MODEL small .STACK .DATA NUM1 DB ? NUM2 DB ? SOMMA DB ? MESSAGE_1 DB ‘Inserisci il primo numero : ','$' MESSAGE_2 DB ‘Inserisci il secondo numero : ','$' .CODE .STARTUP MOV AX,@DATA ; blocco di istruzioni MOV DS,AX ; che serve per MOV DX,OFFSET MESSAGE_1 ; stampare a video MOV AH,9D ; il primo messaggio INT 21H MOV AH, 1D ; funzione per l’input da tastiera INT 21H ; del primo numero. SUB AL,48 ; sottrae lo 0 ASCII per determinare il valore. MOV NUM1,AL ; sposta il contenuto di AL in NUM1 Continua => => Continua MOV DL,10D ; inserisco il codice ASCII 10D per spostare MOV AH,2D ; il cursore ad inizio riga. INT 21H MOV DL,13D ; inserisco il codice ASCII 13D per spostare MOV AH,2D ; il cursore giù di una linea. MOV AX,@DATA ; blocco di istruzioni MOV DS,AX ; che serve per MOV DX,OFFSET MESSAGE_2 ; stampare a video MOV AH,9D ; il secondo messaggio MOV AH, 1D ; funzione per l’input da tastiera INT 21H ; del secondo numero. SUB AL,48 ; sottaggo lo 0 ASCII per determinare il valore. MOV NUM2,AL ; sposta il contenuto di AL in NUM2 ADD AL, NUM1 ; esegue la somma MOV SOMMA, AL ; memorizza/sposta il risultato in SOMMA .EXIT END
Programma che verifica se il numero inserito da tastiera e pari o dispari => Continua MOV DL,10D ; parte di codice che viene MOV AH,2D ; eseguito solo se INT 21H ; il resto è diverso da 0 MOV DL,13D ; va a capo e stampa MOV AH,2D ; a video il messaggio INT 21H ; MESSAGE2 MOV AX,@DATA ; NUMERO DISPARI MOV DS,AX MOV DX,OFFSET MESSAGE2 ; questa parte di codice MOV AH,9D ; si chiude con un salto INT 21H ; incondizionato JMP JMP FINE ; all’etichetta FINE PARI: ; etichetta che identificato parte del codice MOV DL,10D ; parte di codice che viene INT 21H ; il resto è uguale a 0 INT 21H ; MESSAGE1 MOV AX,@DATA ; NUMERO PARI MOV DX,OFFSET MESSAGE1 MOV AH,9D INT 21H FINE: ; etichetta che identificato parte del codice .EXIT ; direttiva che permette il ritorno al S.O. TITLE Pari_Dispari .MODEL small .STACK Divisore EQU 02 .DATA NUM DB ? MESSAGE DB 'INSERISCI UN NUMERO : ','$' MESSAGE1 DB 'NUMERO PARI ','$' MESSAGE2 DB 'NUMERO DISPARI ','$' .CODE MOV AX,@DATA MOV DS,AX MOV DX,OFFSET MESSAGE MOV AH,9D INT 21H MOV AH, 1D SUB AL,48 MOV NUM,AL CMP AL,0 ; confronta il numero inserito con 0 JE FINE ; se è uguale a 0 salta all’etichetta FINE MOV BH, Divisore MOV AH,00 DIV BH ; esegue la divisione per 2 del valore presente in AX CMP AH,0 ; confronta se il resto della divisione è uguale a 0 JE PARI ; se è uguale 0 salta a l’etichetta PARI Continua =>
Programma che dati 2 numeri in input da tastiera, stampa a video qual è il Max il Min o se sono uguali. (Parte 1) Ovviamente più i programmi diventano complessi, maggiore sono le righe di comando che lo compongono. TITLE Max_Min .MODEL SMALL .STACK .DATA NUM_A DB ? NUMB DB ? MESSAGE DB 'INSERISCI IL PRIMO NUMERO : ','$' MESSAGE1 DB 'INSERISCI IL SECONDO NUMERO : ','$' MESSAGE2 DB 'I NUMERI SONO UGUALI ','$' MESSAGE3 DB ' IL NUMERO MAGGIORE ','$' MESSAGE4 DB ' IL NUMERO MINORE ','$' .CODE MOV AX,@DATA MOV DS, AX MOV DX, OFFSET MESSAGE MOV AH, 9D INT 21H MOV AH, 1D SUB AL, 48 MOV NUM_A, AL Continua => In questa prima parte di codice, vi è la dichiarazione delle variabili e delle stringhe da stampare a video e l’acquisizione dei due numeri da tastiera, NUM_A e NUM_B. => Continua MOV DL, 10D MOV AH, 2D INT 21H MOV DL, 13D MOV AX, @DATA MOV DS, AX MOV DX, OFFSET MESSAGE1 MOV AH, 9D MOV AH, 1D SUB AL, 48 MOV NUM_B, AL
Programma che dati 2 numeri in input da tastiera, stampa a video qual è il Max il Min o se sono uguali. (Parte 2) CMP NUM_A, AL ; confronta NUM_A con il contenuto di AL che è NUM_B JE UGUALI ; salto all’etichetta se sono uguali JA MAXA ; salta all’etichetta se NUM_A e maggiore di NUM_B MOV DL, 10D ; altrimenti entra in questa parte del codice perché MOV AH, 2D ; vuol dire che NUM_B è maggiore. INT 21H MOV DL, 13D MOV AH, 2D MOV DL, NUM_B ADD DL, 48 MOV AX, @DATA MOV DS, AX MOV DX, OFFSET MESSAGE3 MOV AH, 9D MOV DL,10D MOV AH,2D MOV DL,13D INT 21H Continua => => Continua MOV DL,NUMA ADD DL,48 MOV AH,2D INT 21H MOV AX,@DATA MOV DS,AX MOV DX,OFFSET MESSAGE4 MOV AH,9D JMP FINE ; ovviamente alla fine di questa ; parte di codice c’è in salto ; incondizionato alla fine del pgr
Programma che dati 2 numeri in input da tastiera, stampa a video qual è il Max il Min o se sono uguali. (Parte 3) => Continua MOV DL, 10D MOV AH, 2D INT 21H MOV DL, 13D MOV DL, NUM_B ADD DL, 48 MOV DL, 32 MOV AX, @DATA MOV DS, AX MOV DX, OFFSET MESSAGE4 MOV AH, 9D JMP FINE ; ovviamente anche alla fine di questa ; parte di codice c’è in salto ; incondizionato alla fine del pgr MAXA: ; in questa etichetta vi è il blocco di pgr MOV DL, 10D ; se NUM_A è risultato maggiore MOV AH, 2D INT 21H MOV DL, 13D MOV DL, NUM_A ADD DL, 48 MOV DL, 32 MOV AX, @DATA MOV DS, AX MOV DX, OFFSET MESSAGE3 MOV AH, 9D Continua =>
Programma che dati 2 numeri in input da tastiera, stampa a video qual è il Max il Min o se sono uguali. (Parte 4) UGUALI: ; in questa etichetta vi è il blocco di pgr MOV DL,10D ; se NUM_A e NUM_B sono uguali. MOV AH,2D INT 21H MOV DL,13D MOV DL,NUM_A ADD DL,48 MOV DL,32 Continua => => Continua MOV DL,NUM_B ADD DL,48 MOV AH,2D INT 21H MOV DL,32 MOV AX,@DATA MOV DS,AX MOV DX,OFFSET MESSAGE2 MOV AH,9D FINE: ; questa è l’etichetta a cui saltano i precedenti .EXIT ; salti incondizionati e termina con la direttiva ; del ritorno al S.O.
Esecuzione del programma con i possibili casi Il programma prevedeva che richiesti 2 numeri da tastiera, verificava quale tra i due era maggiore o se erano uguali. Negli screenshot sono stati simulati i tre casi possibili: Il caso in cui il secondo numero inserito è maggiore. Il caso in cui il primo numero inserito è maggiore. Il caso in cui i numeri inseriti sono uguali.