Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Vari e semplici programmi.
Programmi in Assembly 8086 Vari e semplici programmi.
2
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
3
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
4
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 OP ; 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
5
Programma che esegue la divisione tra 2 variabili
TITLE Divisione2numeri .MODEL small .STACK .DATA Dividendo DB 12 ; variabile con assegnazione valore Divisore DB ; 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
6
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, ; incrementa DI puntando all'elemento successivo DEC CL ; decrementa il contatore CMP CL, ; 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
7
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 ; 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
8
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 ; 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 ; 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
9
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 ; 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 ; 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 MOV DS,AX MOV DX,OFFSET MESSAGE MOV AH,9D INT 21H MOV AH, 1D SUB AL,48 MOV NUM,AL CMP AL, ; 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 =>
10
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 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 MOV DS, AX MOV DX, OFFSET MESSAGE1 MOV AH, 9D MOV AH, 1D SUB AL, 48 MOV NUM_B, AL
11
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 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 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
12
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 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 MOV DS, AX MOV DX, OFFSET MESSAGE3 MOV AH, 9D Continua =>
13
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 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.
14
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.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.