Classi di istruzioni
trasferimento
Input / output
incondizionato
Tra registri
Strutture di controllo
confronto
salto
aritmeticologiche
Shift e rotate
di Stack
condizionato
Sottoprogrammi
e
macro
Immediato
Diretto
Registri di
segmento
Indiretto con registro
Formato di un’istruzione
Codice
operativo
Registri della Dichiarazioni Modalità di
CPU 80x86
di variabili indirizzamento
Registro dei
flags
Registro IP
relativo con registro base
diretto con registro indice
1) Codice Operativo
2) Registri interessati al trasferimento
3) Modalità di indirizzamento
4) Indirizzo o dato immmediato
Codice operativo
registro Modo d’indirizzamento
1) Trasferimento
2) Aritmetico logiche
3) Confronto
4) Salto
5) Input /Output
6) Operazioni sullo stack
7) Shift e Rotate
Istruzioni di Trasferimento
Queste istruzioni trasferiscono il contenuto di una
locazione di memoria in un registro della C.P.U.
e viceversa. L’80x86 utilizza l’istruzione MOV.
Esistono altre istruzioni che consentono di caricare
dati da una porta e trasferire dati all’esterno.
L’80x86 utilizza le istruzione IN e OUT.
Importante! Queste istruzioni non modificano
il registro dei FLAG.
Le principali istruzioni sono:
•Aritmetiche
•Logiche
Istruzioni di Confronto
Le istruzioni di confronto avvengono
sottraendo i due operandi specificati
nell’istruzione con la conseguente modifica
dei Flag.
L’80x86 usa l’istruzione CMP op1,op2
Istruzioni di Salto
1) Salto Condizionato
2) Salto Incondizionato
3) Chiamata di Sottoprogrammi
Istruzioni che operano sullo stack
Si possono eseguire due tipi di operazioni:
1) PUSH operando (inserimento di
due byte nella cima dello stack)
2) POP operando (estrazione di due
byte dalla cima dello stack).
Esempio 1:
Esercizi
Esempio 2:
Vi illustreremo ora l’istruzione PUSH AX
Prima dell’esecuzione
Sp-2
Non sono parte
dello Stack
Sp-1
Sp
Sp+1
Sp+2
00
FF
C2
Ah
Al
03
04
Dopo l’esecuzione
Sp
Sp+1
Sp+2
Sp+3
Sp+4
04
03
00
FF
C2
Il nuovo stack pointer sarà: SP=SP-2
continua
Vi illustreremo ora l’istruzione PUSH AX
Prima dell’esecuzione
F106H
Non sono parte
dello Stack
F107H
F108H
F109H
F10AH
00
FF
C2
Dopo l’esecuzione
F106H
F107H
SP
Ah
Al
03
04
F108H
F109H
F10AH
04
03
00
FF
C2
Il nuovo stack pointer sarà: SP=F106H
Vi illustreremo ora l’istruzione POP BX
Prima dell’esecuzione
Sp
Sp+1
Sp+2
Sp+3
Sp+4
04
03
00
FF
C2
Dopo l’esecuzione
Sp
Bh
Bl
?
?
Sp+1
Sp+2
04
03
00
FF
C2
Non sono parte
dello Stack
Bh
Bl
Il nuovo stack pointer sarà: SP=SP+2
continua
03
04
Vi illustreremo ora l’istruzione POP BX
Prima dell’esecuzione
F106H
F107H
F108H
F109H
F10AH
04
03
00
FF
C2
Dopo l’esecuzione
SP
F108H
Bh
Bl
?
?
F109H
F109H
04
03
00
FF
C2
Non sono parte
dello Stack
Il nuovo stack pointer sarà: SP=F108H
Bh
Bl
03
04
La parola stack (pila) indica
un’organizzazione di dati in memoria.
La relazione che regola il comportamento
della pila è la seguente:
Last In First Out
l’ultimo ad entrare è il primo ad uscire.
PUSH operando
L’operando in questo caso funge da sorgente
dei dati, deve essere a 16 bit e può essere un
registro, una locazione di memoria o un
valore immediato.
POP operando
L’operando in questo caso funge da
destinazione dei dati, deve essere a 16 bit e
può essere un registro o una locazione di
memoria.
PUSH e
POP
1) Scambiare il valore di due variabili usando lo stack.
2) Dati quattro valori A, B, C, D in memoria scambiare
il primo con l’ultimo e il secondo con il terzo.
3) Realizzare un programma che, dopo aver richiesto
una serie di caratteri, li stampi in ordine inverso.
Istruzioni di Salto Condizionato
Le istruzioni di salto condizionato avvengono dopo
l’esecuzione di un’operazione aritmetica o logica e, se
risulta verificato lo stato di un flag, l’esecuzione del
programma prosegue con l’istruzione specificata
dall’operando dell’istruzione di salto.
L’80x86 usa l’istruzione J[condizione]
continua
Istruzioni di Salto Condizionato
•le istruzioni di salto condizionato vengono eseguite in base
al risultato di un confronto tra due valori;
•l’istruzione di confronto compare (cmp) effettua la
sottrazione tra i due operandi modificando i flag SF, ZF, CF
senza memorizzare il risultato;
•La sua sintassi è: CMP op1,op2, dove:
•op1 e op2 devono avere la medesima dimensione;
•op1 non può mai essere una costante
continua
Istruzioni di Salto Condizionato
Le istruzioni di salto condizionato vanno scritte dopo l’istruzione di
confronto;
FLAG DI CARRY
•JNC <indirizzo di riferimento>
salta se op1>=op2
•JC<indirizzo di riferimento>
salta se op1<op2
•JA <indirizzo di riferimento>
•JB <indirizzo di riferimento>
salta se op1>=op2
salta se op1<op2
continua
Istruzioni di Salto Condizionato
flag di zero ZF
•JE <indirizzo di riferimento>
•JNE <indirizzo di riferimento>
oppure
•JZ <indirizzo di riferimento>
•JNZ <indirizzo di riferimento>
salta se op1=op2
salta se op1<>op2
salta se op1=op2
salta se op1<>op2
esercizio
Il processore esegue le istruzioni così come si
presentano, una dopo l'altra. Tuttavia possiamo,
attraverso particolari strutture, controllare il flusso
esecutivo in base ad una determinata condizione.
In questo modo possiamo creare strutture di
semplice selezione o di tipo iterativo (cicli).
esercizio
Il costrutto IF THEN (Selezione semplice)
In pseudocodice
se Condizione allora
sequenza 1
fine selezione
sequenza 2
In assembly:
JCondizione etichetta
... sequenza 1 ...
etichetta:
... sequenza 2 ...
esercizio
Il costrutto IF THEN ELSE (Selezione doppia)
In pseudocodice
Se Condizione allora
sequenza 1
altrimenti
sequenza 2
fine selezione
In assembly:
JCondizione etichetta
... sequenza 2 ...
JMP fine_sel
etichetta:
... sequenza 1 ...
fine_sel:
esercizio
Il costrutto WHILE (controllo in testa)
In pseudocodice
mentre condizione
istruzioni
fine ciclo
In assembly:
inizio_ciclo:
JNcondizione fine_ciclo
sequenza
JMP inizio_ciclo
fine_ciclo:
esercizio
Il costrutto WHILE (controllo in coda)
In pseudocodice
ripeti
istruzioni
finchè condizione
In assembly
inizio_ciclo:
istruzioni
JNcondizione inizio_ciclo
esercizio
Il ciclo a contatore
In pseudocodice
ripeti per N volte
sequenza
fine ciclo
In assembly
MOV CX, <N>
inizio_ciclo:
sequenza
LOOP inizio_ciclo
esercizio
Istruzioni di Salto Condizionato
esercizio
•Creare un programma in linguaggio assembler che effettui la
ricerca di un numero contenuto nella variabile “NUM” in un array
di indirizzo mnemonico “vet”. Se la ricerca dà esito positivo
assegnare ad una variabile di nome “trovato” il valore 1 e
visualizzare il messaggio corrispondente.
Istruzioni di Salto Incondizionato
Le istruzioni di salto incondizionato fanno sì che
il controllo del programma venga trasferito ad un
indirizzo specificato dall’istruzione stessa.
L’80x86 usa l’istruzione JMP <etichetta>
•Chiamata di un sottoprogramma
•Macro
continua
Istruzioni di Chiamata di un sottoprogramma
L’istruzione di chiamata CALL fa sì che il
controllo del programma venga trasferito ad un
indirizzo specificato dall’istruzione stessa.
Una volta terminata la subroutine, l’istruzione
RET farà riprendere l’esecuzione del programma
dal punto successivo alla chiamata.
continua
Vi illustreremo ora l’istruzione:
CALL nome
FF00H
call
00
FF
Istruzione
succesiva
prima
istruzione
della
subroutine
Il programma salta all’indirizzo
specificato ma “ricorda” dove
ritornare in seguito
FF01H
FF02H
FF03H
Il controllo del programma
ritorna (RET) al
programma principale
ret
FF04H
esempio
CALL delay
Indirizzo di rientro
dalla subroutine
Valore iniziale
della Cima dello
Stack
Indirizzo inizio subroutine
Valore di SP
continua
CALL delay
Indirizzo
di rientro
Valore di SP
continua
CALL delay
Indirizzo
di rientro
Valore di SP
continua
CALL delay
Indirizzo dell’istruzione
successiva alla
chiamata della
subroutine
Valore della
Cima dello Stack
Valore di SP
Passaggio dei parametri
Vi illustreremo ora un sottoprogramma (ciclo di ritardo) che usa
diverse tecniche di passaggio di parametri :
1) Tramite registro
DOSSEG
.MODEL SMALL
.STACK 200h
.CODE
mov BX, 0FFFFH
call Delay ;
mov ah,4ch
int 21h
Delay:
mov CX, BX
DelayLoop: nop
loop DelayLoop; esegue 64K cicli
ret
END
continua
Vi illustreremo ora un sottoprogramma (ciclo di ritardo) che usa
diverse tecniche di passaggio di parametri :
2) Tramite lo Stack (1)
DOSSEG
.MODEL SMALL
.STACK 200h
.CODE
mov BX, 0FFFFH; n° di cicli di ritardo
push BX
call Delay ;
mov ah,4ch
int 21h
Delay:
mov BP,SP;indirizzo della cima dello stack
mov CX,[BP+2]; numero di cicli di ritardo
DelayLoop: nop
loop DelayLoop; esegue 64K cicli
ret
END
continua
Vi illustreremo ora un sottoprogramma (ciclo di ritardo) che usa
diverse tecniche di passaggio di parametri :
3) Tramite lo Stack (2)
Cont
DOSSEG
.MODEL SMALL
.STACK 200h
.DATA
DW 0FFFFH
.CODE
push cont; n° di cicli di ritardo
call Delay ;
mov ah,4ch
int 21h
Delay:
pop DX
pop CX; numero di cicli di ritardo
push DX;indirizzo di rientro
DelayLoop: nop
loop DelayLoop; esegue 64K cicli
ret
END
continua
Vi illustreremo ora un sottoprogramma (ciclo di ritardo) che usa
diverse tecniche di passaggio di parametri :
4) Tramite locazioni di memoria
Cont
DOSSEG
.MODEL SMALL
.STACK 200h
.DATA
DW 0FFFFH
.CODE
call Delay ;
mov ah,4ch
int 21h
Delay:
mov CX, cont; numero di cicli di ritardo
DelayLoop: nop
loop DelayLoop; esegue 64K cicli
ret
END
esercizi
Uso delle subroutine
Realizzare un programma in linguaggio assembly che visualizzi il
seguente messaggio:
”La classe quarta O
Augura
Buone feste”,
utlizzando una subroutine che venga richiamata più volte
passando ogni volta un pezzo del messaggio con le diverse
tecniche di passaggio dei parametri.
Vi illustreremo ora l’istruzione:
OUT DX, AL
Dove DX contiene l’indirizzo della porta e
l’accumulatore AX o AL contiene il dato da
trasferire alla porta selezionata
esempi
dosseg
.model small
.code
mov ax,@data
mov ds,ax
mov al,01010101b
mov dx,3bch
out dx,al
mov ah,4ch
int 21h
end
dosseg
.model small
.code
mov ax,@data
mov ds,ax
mov al,01010101b
mov dx,00
mov ah,01
int 17h
mov ah,4ch
int 21h
end
Il 1° programma trasferisce alla porta parallela il cui indirizzo è 03BCh il
valore binario 0101010101. Il 2°, usa l’interrupt 17H del BIOS.
esercizi
esercizi
1) Realizzare un programma
in linguaggio Assembler che accenda
alternativamente gli otto leds collegati alla porta parallela. Ciascun led
deve rimanere acceso per circa 1/2 secondo, e la relativa routine di
ritardo deve utilizzare le diverse modalità di passaggio dei parametri.
Obiettivo: interfacciamento tramite porta parallela, uso delle subroutine e
relativo passaggio dei parametri, uso delle istruzioni di shift.
2) Realizzare un programma in linguaggio Assembler che letto da tastiera
un numero ad una cifra, visualizzi il corrispondente valore binario sugli otto
led collegati alla porta parallela.
Obiettivo: interfacciamento tramite porta parallela, uso degli interrupt.
Per usare la porta parallela scaricare il sw da giobe2000 configura lpt1
•Istruzioni di SHIFT
•Istruzioni di ROTATE
Istruzioni di SHIFT
1) SHL (scorrimento logico verso sinistra), sposta ciascun bit di
una posizione verso sinistra. Il bit più significativo esce e
viene posto nel flag di carry, nel bit meno significativo viene
posto uno zero.
2) SHR (scorrimento logico verso destra), sposta ciascun bit di
una posizione verso destra. Il bit meno significativo esce e
viene posto nel flag di carry, nel bit più significativo viene
posto uno zero.
continua
Istruzioni di SHIFT
La sintassi è la seguente:
1) SHL destinazione, contatore
2) SHR destinazione, contatore
Dove destinazione è un registro e contatore è un numero o il
registro CL, e indica il numero di traslazioni da eseguire sul
registro.
esempio
SHL AL,1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
carry
prima
dopo
0FH
1DH
AL
AL
1
0
SHR AL,1
0
0
0
0
1
1
1
1
0
0
0
0
0
1
1
1
1
carry
AL
0FH
prima
AL
07H
dopo
Istruzioni di ROTATE
1) ROL (rotazione logica verso sinistra), sposta ciascun bit di
una posizione verso sinistra. Il bit più significativo esce e
viene posto nel bit meno significativo.
2) ROR (rotazione logica verso destra), sposta ciascun bit di
una posizione verso destra. Il bit meno significativo esce e
viene posto nel bit più significativo.
continua
Istruzioni di ROTATE
La sintassi è la seguente:
1) ROL destinazione, contatore
2) ROR destinazione, contatore
Dove destinazione è un registro e contatore è un numero o il
registro CL, e indica il numero di traslazioni da eseguire sul
registro.
esempio
ROL AL,1
prima
AL 0FH
0
0
0
0
1
1
1
1
dopo
1DH
AL
0
0
0
1
1
1
1
0
ROR AL,1
prima
AL 0FH
0
0
0
0
1
1
1
1
dopo
17H
AL
1
0
0
0
0
1
1
1
Esercizi
Realizzare un programma in linguaggio assembly che letto un numero (0-9) da
tastiera ne determini il doppio utilizzando e istruzioni di shift e lo visualizzi.
Obiettivo: uso dell’interrupt del dos e delle istruzioni di shift e rotate
Realizzare un programma assembler 8086/88 che effettui il conteggio dei numeri
pari in una lista memorizzata a partire dall'indirizzo mnemonico start. usare le
istruzioni le istruzioni di shift e rotate.
Obiettivo: uso delle istruzioni delle istruzioni di shift e rotate.
Esercizi
Realizzare un programma in linguaggio Assembly che effettui la conversione
dalla rappresentazione ASCII a quella binaria. Il dato di partenza è una stringa di
otto caratteri ASCII rappresentanti ognuno il valore binario zero o uno (trenta e
trentuno in ASCII). A partire da tale stringa, che inizia alla locazione di
indirizzo mnemonico “ascii”, bisogna generare un solo byte, contenuto nella
variabile “bin”, che riporti esattamente il valore binario corrispondente agli otto
byte di partenza.
Obiettivo: uso delle istruzioni logiche e/o delle istruzioni di shift e rotate
Il codice operativo indica il tipo di operazione da
eseguire su gli operandi.
Es.: somma, trasferimento, etc...
Gli operandi rappresentano gli oggetti interessati
all’operazione da eseguire.
Es.: registri, dato, locazioni di memoria.
bit
15
I registri di uso generale sono:
AH
BH
CH
DH
AL
BL
CL
DL
SP
BP
SI
DI
bit
0
AX Accumulatore
BX Base
CX Contatore
DX Dati
Puntatore di Stack
Puntatore di base
Indice sorgente
Indice destinazione
Altri registri
Che cosa è un registro?
Un registro è un circuito di
memorizzazione temporanea la
cui capacità è di solito uguale ad
una parola del computer.
I registri di segmento: CS, DS, SS, ES.
Il registro dei Flags
Il contatore di programma (IP)
Il registro dei Flags
NT
IOPL
OF DF IF TF
SF ZF
AF
PF
CF
15
Bit
0
Bit
CF=Carry flag
PF=Parity flag
AF=Carry Ausiliario
ZF= flag di Zero
SF= flag di segno
TF=Trap flag
IF=Interrupt flag
DF=Direction flag
OF=Overflow flag
IOPL=Input/output Privilege Level
NT=Nested Task
Il Contatore di Programma (IP)
Il Program Counter (PC) o Istruction Pointer (IP) contiene
l’indirizzo della prossima istruzione da eseguire.
Viene incrementato alla fine della fase di “FETCH”
(acquisizione dell’istruzione dalla memoria da parte della
C.P.U.).
il Flag di Carry
Il Flag di Carry (CF) assume il valore 1 quando
viene generato un riporto da un’operazione
aritmetica. In caso contrario assume il valore 0.
Questo Flag viene usato anche nelle operazione di
SHIFT o ROTATE e contiene il bit che le
istruzioni stesse hanno espulso dal registro.
Il Flag di Parità
Il Flag di Parità (PF) viene utilizzato per scoprire
principalmente errori di trasmissione di dati e
assume il valore 1 nel caso di parità dispari e il
valore zero nel caso di parità pari.
Il Flag di di Carry Ausiliario
Il Flag di carry ausliario (AF) viene utilizzato
nell’aritmeticaBCD (Binary Coded Decimal) per
indicare se si è verificato un riporto oppure un
prestito nei quattro bit meno significativi di un
valore numerico espresso in notazione BCD.
Il Flag di Zero
Il Flag di Zero (ZF) assume il valore 1 se il risultato
dell’operazione aritmetica o logica è zero;
il valore zero se il risultato è diverso da zero.
Il Flag di Segno
Il Flag di Segno (SF) assume il valore 1 se il
risultato dell’operazione è un numero negativo, il
valore zero se è un numero positivo (assumendo
una rappresentazione dei numeri in complemento
a due). Questo Flag è semplicemente la copia del
bit più significativo del risultato di un’operazione.
Il Flag di Overflow
Il Flag di Overflow (OF) indica il superamento dei limiti
per la rappresentazione del risultato nelle operazioni
aritmetiche con segno (complemento a due). Se la somma
di due numeri negativi dà un risultato positivo o la
somma di due numeri negativi dà un risultato negativo,
il flag è settato, cioè vale 1.
Il Flag è resettato (valore zero) se non vi è overflow.
Che cosa si intende per metodo d’indirizzamento?
Per metodo d’indirizzamento si intende l’insieme
delle tecniche che permettono il trasferimento dei
dati tra:
C.P.U. e memoria, e viceversa;
C.P.U. e mondo esterno, e viceversa;
registri interni alla C.P.U.
I metodi usati
Le principali tecniche d’indirizzamento:
1)Tra registri
2) immediato
3) diretto
4) indiretto con registro
5) indirizzamento relativo con registro base
6) diretto con registro indice
Tra registri della C.P.U.
Lo scambio può avvenire tra registri a 8 bit ad es.:
MOV DL,AL
oppure tra registri a 16 bit ad es.:
MOV DS,AX
In questo esempio, il dato viene trasferito dal registro
AX (sorgente) al registro DS (destinazione).
Esempi
Tra registri della C.P.U.
ad es. l’istruzione: MOV DX,AX
Prima
Dopo
AX
AH
1F
AL
0A
DX
DH
7D
DL
E4
AX
AH
1F
AL
0A
DX
DH
1F
DL
0A
Immediato
Ad es. l’istruzione: MOV AX,5DFF
carica il registro Ax con il valore numerico
dell’operando contenuto nell’istruzione
Prima
AH
AX 1F
AL
0A
Dopo
AH
AX 5D
AL
FF
Diretto
Ad es. l’istruzione: MOV AX,DATI
carica il registro Ax con il valore delle locazioni di
memoria di indirizzo mnemonico “DATI”.
AX
AH
1F
AL
0A
F100
F101
F102
1F
F103
0A
F104
DATI
Indiretto tramite registro
Ad es. l’istruzione: MOV AL,[BX]
carica il registro AL con il valore delle locazioni di
memoria il cui indirizzo è contenuto nel registro.
AX
BH
F1
BL
02
AH
AL
7F
BX
F100
F101
F102
7F
F103
CA
F104
Relativo con registro BASE
L’indirizzo effettivo dell’operando, viene determinato
sommando uno spiazzamento al contenuto di un registro
base, (BX o BP).
Es.: MOV AL,[BX]+4
E’ utilizzato spesso per accedere a strutture di tipo record.
Il registro base punta alla base della struttura dati e lo
spiazzamento permette di accedere al campo interessato.
Esempio
Relativo con registro base
Ad es. l’istruzione: MOV AL,[BX]
carica il registro AL con il valore delle locazioni di
memoria il cui indirizzo è contenuto nel registro.
AX
BH
F1
BL
02
AH
AL
7F
BX
F100
F101
F102
7F
F103
CA
F104
Diretto con registro Indice
L’indirizzo effettivo dell’operando, viene determinato
sommando l’indirizzo base (inizio del vettore) ad uno
spiazzamento contenuto di un registro indice, (SI o DI).
Questo metodo è utilizzato per accedere agli elementi di un
array. Il registro indice contiene un indirizzo relativo a
partire dal valore 0000h (prima posizione) e, seleziona un
elemento all’interno della struttura dati.
Esempio
Diretto con registro Indice
Es.: MOV SI, 0003
MOV AL, VET[SI]
SI
00
AH
AX
VET
03
F100
F101
AL
CA
F102
7F
F103
CA
F104
Dichiarazione di una variabile
Dichiarazione di una variabile stringa
Dichiarazione di una variabile vettore
Dichiarazione di una variabile stringa
Nomevar
DB “stringa”,0Ah,0Dh, “$”
Dichiarazione di una variabile
Nomevar
DB num8
Nomevar
DW num16
Esempi:
Var1
DB 0Fh
Var2
DW 0C37H
Dichiarazione di una variabile vettore
Nome variabile
ES:
DB elenco valori
VET
DB 01h, 55h, 0F1h, 0ECh, 09h
Abbiamo dichiarato un vettore di 5 elementi di un byte ciascuno
01
55
F1 EC
09
VET
continua
Dichiarazione di una variabile vettore
Nome variabile
ES:
VET
n°elementi
DUP ( ?)
DB 10 DUP(?)
Abbiamo riservato un vettore di 16 elementi di un byte ciascuno di valori
indefiniti
ES:
VET
DB 0Eh DUP(“*”)
Abbiamo dichiarato un vettore di 14 asterischi di un byte ciascuno
esercizio
Istruzioni Aritmetiche
Le principali sono:
1) Istruzione di somma: ADD
2) Istruzione di sottrazione: SUB
3) Istruzione di moltiplicazione: MUL
4) Istruzione di divisione: DIV
Le istruzioni logiche eseguono le operazioni logiche bit
a bit, permettono di modificare i singoli bit e il registro
dei flag.
Le principali sono:
1) Istruzione logica di somma: OR
2) Istruzione logica di moltiplicazione : AND
3) Istruzione di: XOR
4) Istruzione logica di negazione: NOT
5) Istruzione logica di TEST
continua
Istruzione AND
L’istruzione AND esegue l’AND bit a bit sugli operandi.
Il risultato è memorizzato nel primo operando
La sintassi è la seguente:
AND op1,op2
Flags modificati: CF, OF, PF, SF, ZF (AF non definito)
Op1 può essere un registro o una locazione di memoria;
Op2 può essere un registro o una locazione di memoria o un
valore immediato.
continua
Istruzione AND
L’istruzione AND può essere usata per azzerare un singolo
bit:
AND AL, 01111111B
Azzera il bit più significativi lasciando inalterati gli altri.
continua
Istruzione AND
L’istruzione AND viene usata per implementare una
tecnica mediante la quale certi bit di una parola vengono
“coperti”. Tale tecnica prende il nome di bit masking.
Ad esempio nella visualizzazione di un numero a due cifre
per isolare il semibyte meno significativo potremo utilizzare
la seguente “maschera”:00001111B
continua
Istruzione AND
Se, per esempio, volessimo visualizzare il numero 43h e se
applicassimo tale maschera, avremo come risultato il
seguente:
Numero da visualizzare: 01000011B
“maschera”:
00001111B
Risultato:
00000011B
Istruzione AND
Per cui eseguiamo prima l’istruzione ROR reg,4 e
applichiamo la maschera e dopo:
Numero da visualizzare: 01000011B
ROR reg,4
00110100B
“maschera”:
00001111B
Risultato:
00000100B
Istruzione AND
Realizzare un programma in linguaggio assembly che
determini il numero di elementi dispari in un vettore;
Obiettivo: uso dell’istruzione AND.
Realizzare un programma in linguaggio assembly che
letto da tastiera un carattere minuscolo lo trasformi in
maiuscolo;
Obiettivo: uso dell’istruzione AND.
Istruzione OR
L’istruzione OR può essere usata per impostare ad uno un
bit:
OR AL, 10000000B
Pone ad uno il bit più significativo lasciando inalterati gli altri.
continua
Istruzione OR
L’istruzione OR esegue l’OR bit a bit sugli operandi.
Il risultato è memorizzato nel primo operando
La sintassi è la seguente:
OR op1,op2
Flags modificati: CF, OF, PF, SF, ZF (AF non definito)
Op1 può essere un registro o una locazione di memoria;
Op2 può essere un registro o una locazione di memoria o un
valore immediato.
Istruzione OR
OR viene molto spesso usato per testare il valore di un registro. Ad
esempio, se vogliamo controllare che dx sia zero, basterà fare un:
or dx,dx
jz ........
Così facendo, infatti, non modifichiamo il valore di dx, mentre
settiamo i flags a seconda che il registro al sia uguale a zero, un
numero negativo, ecc.
Istruzione OR
Realizzare un programma in linguaggio assembly che
letto da tastiera un carattere maiuscolo lo trasformi in
minuscolo.
Obiettivo: uso dell’istruzione OR.
Es.: cod ASCII di “A”=01000001
cod ASCII di “a”=01100001
Istruzione XOR
L’istruzione XOR esegue l’OR esclusivo bit a bit sugli
operandi. Il risultato è memorizzato nel primo operando.
La sintassi è la seguente:
XOR op1,op2
Op1 può essere un registro o una locazione di memoria;
Op2 può essere un registro o una locazione di memoria o un
valore immediato
continua
Istruzione XOR
L’istruzione XOR può essere usata per invertire un bit
Quindi può rendere un carattere maiuscolo o minuscolo a
secondo della situazione iniziale:
XOR AL, 10000000B
inverte il bit più significativo di AL lasciando inalterati gli altri.
Istruzione XOR
XOR viene spesso usato per azzerare un registro. Infatti, come
dovreste già sapere, un numero XORato con sè stesso restituisce
zero. Ad esempio:
xor ax,ax
azzererà ax.
Istruzione XOR
Un altro motivo per cui si utilizza l'istruzione xor è la sua
reversibilità. Infatti, una volta eseguita la XOR tra il valore A e il
valore B, eseguendola nuovamente tra risultato e B si otterrà di
nuovo A... ovvero, traducendo in formula:
(A XOR B) XOR B = A
Questa caratteristica lo rende particolarmente adatto per i sistemi
di crittografia.
Istruzione XOR
Realizzare un programma in T. A. che esegui il Cheksum di una
serie di locazioni di memoria. Il valore di controllo è contenuto
nella variabile CTRL. Visualizzare un messaggio se il controllo ha
dato esito positivo.
Realizzare un programma in T. A. che esegui la crittografia di un
messaggio. La chiave è contenuta nella variabile KEY. Visualizzare il
messaggio crittografato e decrittografato.
Istruzione NOT
L’istruzione NOT inverte tutti i bit dell’operando (da 0
ad 1 e viceversa).
La sintassi è la seguente:
NOT operando
Flags modificati: nessuno
Operando può essere un registro o una locazione di memoria.
Istruzione TEST
L’istruzione TEST esegue l’operazione logica AND bit
a bit su due operandi. Il risultato dell’operazione non
viene utilizzato ma, viene modificato il registro dei flag.
La sintassi è la seguente:
TEST operando1, operando2
Operando può essere un registro o una locazione di memoria.
Le istruzioni logiche sono usate nel controllo di
dispositivi esterni. Esse permettono di determinare se
un dispositivo è acceso (ON) o spento (OFF).
esempio
Vogliamo, con questo esercizio, rilevare quali tra otto
dispositivi abbia cambiato stato nell’intervallo di tempo
che intercorre tra due letture e, in che direzione è avvenuto
tale cambiamento, (da ON a OFF o da OFF a ON)
BIT 0: Misuratore di pressione
BIT 1: Misuratore di temperatura
BIT 3: Misuratore di velocità
BIT 4: Misuratore di portata
BIT 5: Misuratore di tensione
BIT 6: Misuratore di corrente
BIT 1: Misuratore di livello liquidi
BIT 1: Misuratore di frequenza
continua
Vogliamo con l’aiuto delle istruzioni logiche rispondere alle
seguenti domande:
•Lo stato logico del BIT di stato è 0 o 1;
•Rispetto allo stato precedente, il bit di stato è cambiato o è
rimasto invariato
•Se è cambiato, il cambiamento è avvenuto passando da
0 ad 1 o da 1 a 0.
Sia:
10001000: Byte di stato iniziale
00001001: Byte di stato attuale
continua
Applicchiamo l’istruzione logica XOR
10001000: Byte di stato iniziale
00001001: Byte di stato attuale
10000001:risultato
Il risultato indica quali dispositivi hanno cambiato stato (bit ad 1)
continua
Applichiamo ora l’istruzione logica AND
10001000: Byte di stato iniziale
10001000: Byte di stato iniziale
10000001: Risultato precedente ottenuto dalla XOR
10000000:risultato
Il risultato indica quali dispositivi hanno cambiato stato passando
da ON a OFF (bit ad 1)
continua
Applichiamo ora l’istruzione logica NOT al risultato
10001000: Byte di stato iniziale
00001001: Byte di stato attuale
10000001
10000000: Risultato precedente (dispositivi da ON a OFF)
01111111:Risultato attuale
Il risultato indica quali dispositivi non hanno cambiato stato
passando da ON a OFF (bit ad 1)
continua
Applichiamo ora l’istruzione logica AND al risultato
10001000: Byte di stato iniziale
00001001: Byte di stato attuale
10000001: Risultato della XOR
01111111: Risultato precedente
00000001: Risultato attuale
Il risultato indica quali dispositivi hanno cambiato stato passando
da OFF a ON (bit ad 1)
La direttiva Macro definisce un insieme di istruzioni che
possono essere ripetutamente invocate in qualsiasi punto
del programma scrivendo semplicemente il nome della
macro. La macro viene ricopiata quando nel programma si
incontra il suo nome.
La struttura è la seguente:
<Nome della macro> MACRO [<lista parametri formali>]
<Istruzioni>
ENDM
continua
Esempio:
;pulizia dello schermo nessun parametro
cancella MACRO
Mov cx,00
Mov dx,2479H
Mov bh,07
Mov AX,0600H
Int 10H
ENDM
continua
Esempio:
;visualizzazione sullo schermo del valore della variabile testo
stampachar MACRO testo
lea DX, Testo
Mov AH,09H
int 21h
ENDM
continua
Vantaggi delle macro:
1. Le macro garantiscono una rapida esecuzione del codice, in
quanto vengono eseguite in sequenza;
2. Possono essere memorizzate facilmente in una libreria di
Macro.
Svantaggi delle macro:
1. Le macro incrementano il codice sorgente, in quanto vengono
espanse ogni volta che il programma le chiama.
continua
1. Nel caso di routine brevi, utlizzare la soluzioni a macro
(operazioni più rapide con piccolo incremento di codice);
2. Nel caso di routine che non vengono chiamate frequentemente
da un programma, utilizzare la soluzione a macro.
3. Nel caso di routine di grandi dimensioni, utilizzate la soluzione
a procedure (ottimizzazione della lunghezza del codice
sorgente).
4. Nel caso di routine che vengono chiamate frequentemente da
un programma, utilizzate la soluzione a procedure (le
procedure non vengono espanse all’interno del programma).