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).