Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
• insieme di istruzioni che un elaboratore è in • conoscere i dettagli relativi alla scrittura delle
grado di eseguire direttamente singole istruzioni:
- codici numerici e formato interno delle
• strettamente correlato alla realizzazione fisica istruzioni macchina
dell'elaboratore - rappresentazione degli operandi
“Copia il valore della variabile alfa nel registro BX” Ad esempio, per scrivere nel linguaggio macchi-
na dell'8086 l'istruzione:
• Il campo Op-code specifica il tipo di operazione • 14 diversi codici operativi, in funzione del
richiesta (es., “copia”) tipo degli operandi
nomeSeg ENDS
nome ENDP
E' l'indirizzamento più compatto e veloce E' l'indirizzamento in memoria più semplice
L'operando è già nella CPU e quindi non è L'EA è contenuto nel campo displacement
necessario accedere alla memoria dell'istruzione - un valore senza segno di 8 o 16
bit
Il registro può essere a 8 o a 16 bit
Var DW ?
MOV AX, CX ; AX <- CX (16 bit) ...
MOV AX, Var; AX <- Var (16 bit)
Operando Immediato
typedef struct
{
int giorno,mese,anno;
} dataType;
dataType d1,d2,d3;
Sommano 2 operandi di 8 o 16 bit. Uno dei due Esempio: Somma di due numeri di 32 bit
operandi può risiedere in memoria, l’altro è collocati in coppie di registri:
necessariamente un registro (o una costante, nel
caso dell’operando sorgente).
(AX:BX) <- (AX:BX) + (CX:DX)
ADD somma l'operando sorgente all'operando
destinazione e memorizza il risultato nell'ope- ADD BX, DX ; somma i 16 bit meno significativi
rando destinazione: ADC AX, CX ; somma i 16 bit più significativi
Con la sintassi del C: La ADD modifica il contenuto del registro dei flag, e
in particolare CF che assume il significato di bit di
destinazione += sorgente riporto.
La SUB modifica il contenuto del registro dei flag, e Lo scopo è quello di modificare il valore di alcuni
in particolare CF che assume il significato di bit di flag (ved. SUB).
prestito.
Il salto condizionato è utilizzato per implementare Esempio: realizzazione di un test a tre vie
gli operatori relazionali (==, !=, >, <, >=, <=).
CMP AX, BX
Ad esempio, per controllare se AX e BX contengono JAE LabelGreaterOrEqual
lo stesso valore, si utilizza l'istruzione CMP seguita ... ; istruzioni eseguite se AX < BX
da un opportuno salto condizionato: LabelGreaterOrEqual:
JA LabelGreater
CMP AX, BX ... ; istruzioni eseguite se AX = BX
JE LabelZero LabelGreater:
... ; istruzioni eseguite se AX > BX
Per alcuni tipi di test è necessario scegliere tra due
esegue tre differenti blocchi di istruzioni, in
differenti istruzioni di salto, a seconda che si
funzione dei valori senza segno contenuti nei
stia testanto il risultato di un'operazione tra valori
registri AX e BX
con o senza segno (mnemonico: “G”, “L”: greater,
nel caso di valori con segno, sostituire JAE con
less (con s.); “A”, “B”: above, below (senza s.))
JGE e JA con JG.
fun (arg1, arg2,..., argN) → push argN sub sp,xxx (numero byte necessario)
...
push arg2 salvataggio registri: per convenzione, in uscita devono
push arg1 avere il loro vecchio valore:
call _fun
add sp, n_byte_arg BP, SP, CS, DS, SS, DI, SI
_fun endp
_func PROC NEAR
PUSH BP
Osservazione: il salvataggio inziale di BP, e il suo MOV BP, SP
ripristino al termine, consentono che la procedura sia
chiamata da un’altra procedura in cui BP svolge un
analogo ruolo di riferimento al record di attivazione.
SP Vecchio valore di BP BP
SP + 2 Offset di ritorno BP + 2
SP + 4 I BP + 4
SP + 6 K BP + 6
SP + 8 22 BP + 8
˝ SP + 2 indirizzo di ritorno BP + 2
_TEXT segment byte public 'CODE'
˝
SP + 4 dpar BP + 4
assume cs:_TEXT,ds:_DATA
˝
_fun proc near
˝
push bp
˝
˝
mov bx,word ptr [bp+4] ; bx <- dpar
mov bp,sp
˝
˝
; dtemp.giorno = dpar->giorno;
˝
; dtemp.mese = dpar->mese;
dtemp + 2 è l’indirizzo del secondo campo _DATA segment word public 'DATA'
stArray dw 15 dup (?)
; dtemp.anno = dpar->anno;
_DATA ends
mov ax,word ptr [bx+4]
mov word ptr dtemp+4,ax _TEXT segment byte public 'CODE'
assume cs:_TEXT,ds:_DATA
dtemp + 4 è l’indirizzo del terzo campo
pop bp
ret _fun proc near
_fun endp push bp
_TEXT ends mov bp,sp
end push si ; j è in si
; stArray[j] = array[j];