ISTRUZIONI ASSEMBLY
MOV DST, SRCCopia SRC in DSTNon posso copiare direttamente da memoria a memoria
PUSH SRCInserisce SRC in cima allo stackDecrementa ESP (Stack Pointer) di tanti byte quanti ne contiene SRC
POP DSTPreleva un valore dalla cima dello stack di grandezza dipendente da DSTIncrementa ESP
- Per tornare alle condizioni originali (prima delle PUSH/POP eseguite) occorre reimpostare ESP al valore di partenza (manualmente, con una MOV)
XCHG DS1, DS2"Scambia" il contenuto di DS1 e quello di DS2
LEA DST, SRCCarica in DST l'indirizzo di memoria di SRCSfruttato anche per eseguire operazioni aritmetiche più o meno complesse. Ad esempioLEA EAX, [EBX*2+10] equivale aEAX = EBX*2+10
CMOVcc DST, SRCCopia il valore SRC in DST solo se la condizione cc risulta verificata
- Tutte le operazioni devono essere eseguite tra registri e vari/registri con la stessa dimensione
Istruzioni Assembly
MOV DST, SRCCopia SRC in DSTNon possa copiare direttamente da memoria a memoria
PUSH SRCInserisce SRC in cima allo stackDecrementa ESP (Stack Pointer) di tanti byte quanti ne contiene SRC
POP DSTPreleva un valore dalla cima dello stack di grandezza dipendente da DSTIncrementa ESP
★ Per tornare alle condizioni originali prima delle PUSH/POP eseguite, occorre reimpostare ESP al valore di partenza(manualmente, con una MOV)
XCHG DS1, DS2Scambia il contenuto di DS1 e quello di DS2
LEA DST, SRCCarica in DST l'indirizzo di memoria di SRCSfruttato anche per eseguire operazioni aritmetiche più o meno complesse. Ad esempioLEA EAX, [EBX*2+10] equivale aEAX = EBX*2+10
CMOVcc DST, SRCCopia il valore SRC in DST solo se la condizione cc risulta verificata
★ Tutte le operazioni devono essere eseguite tra registrie variabili/registri con la stessa dimensione
ADD DST, SRCSomma SRC a DST salvando su DST
SUB DST, SRCSottrae SRC a DST e salva su DST
MUL SRCMoltiplicazione senza segno
- SRC 8 bit AX = AL x SRC (8 bit)
- SRC 16 bit DX:AX = AX x SRC (16 bit)
- SRC 32 bit EDX:EAX = EAX x SRC (32 bit)
Non posso moltiplicare direttamente per una costante, devo obbligatoriamente copiarla su un registro
IMULMoltiplicazione con segno
- IMUL SRC
- IMUL DST, SRC DST = DST * SRC
- IMUL DST, SRC1, SRC2 DST = SRC1 * SRC2
- Uguale a MUL per la distribuzione dei registri
- SRC può anche essere un valore immediato
- SRC2 è per forza un valore immediato
C'è elevata probabilità di overflow. Controllare il Flag OF (se è uguale a 1 c'è stato overflow)
DIV SRCDivisione senza segnoSRC rappresenta il divisore (deve essere ≠ da zero)
- SRC 8 bit AX | SRC | divide AX per SRC
- AH | AL | il risultato è in AL il resto in AH
- SRC 16 bit DX:AX | SRC
- DX | AX
- SRC 32 bit EDX:EAX | EBX
- EDX | EAX
Quoziente x Divisore + Resto = Dividendo
IDIV SRCdivisione con segnoA parte il segno resta uguale a DIV.
CDQEstende il registro a 64 bit su EDX:EAX.Non ha operandi.
INC DSTIncrementa di 1 DST.Più efficiente di ADD DST, 1Overflow aritmetico se ZF = 1.
DEC DSTDecrementa di 1 DST.Più efficiente di SUB DST, 1Underflow e verificabile se SF = 1.
NEG DSTCambia il segno a DST.
ADD DST, SRCAggi bit a bit con salvataggio su DST.Il bit è uguale a 1 se e solo se i due bit di partenza erano a 1.
OR DST, SRCOr bit a bit con salvataggio su DST.Il bit è uguale a 0 solo se i due bit di partenza erano a 0.
XOR DST, SRCXor bit a bit con salvataggio su DST.Il bit è uguale a zero se i bit di partenza erano uguali, è uguale a 1 se erano diversi.
SAL
DST, *
Shift aritmetico a sinistra (in decimale equivale alla moltiplicazione per due del numero).
- * può essere un valore immediato (8 bit) o il registro CL.
- Il bit meno significativo prende valore 0, quello più significativo esce e finisce in CF.
SAR
DST, *
Shift aritmetico a destra (equivale a una divisione per due).
- Il bit meno significativo finisce in CF, quello più significativo prende lo stesso valore del precedente bit più significativo (il segno resta quindi uguale).
- Se DST è positivo il risultato è arrotondato per difetto.
- Se DST è negativo il risultato è arrotondato per eccesso.
SHL
DST, *
Shift logico a sinistra.
Opera analogamente a SAL.
SHR
DST, *
Shift logico a destra.
Opera come SAR se non che il nuovo bit più significativo è uguale a 0 (non si mantiene il segno iniziale).
ROL
DST, *
Rotazione logica a sinistra.
Il bit più significativo esce a sinistra e rientra a destra diventando il bit meno significativo.
ROR
DST, *
Rotazione logica a destra.
Il bit meno significativo esce a destra e rientra a sinistra diventando il bit più significativo.
NOT DST
Negazione bit a bit di DST.
TEST SRC1, SRC2
Esegue l'AND logico tra SRC1 e SRC2 (SRC2 è usato come maschera).Non memorizza il risultato (il valore di SRC1 non cambia, come invece avviene con AND) ma imposta solo alcuni flag: SF (segue in memoria il bit del segno); ZF (ha valore 1 se il risultato è zero); PF (impostato se il byte meno significato è pari).
CMP SRC1, SRC2
Esegue la sottrazione SRC1 - SRC2.Il risultato non è salvato (SRC1 è invariato).Imposta i flag CF (carry), SF (segno), ZF (zero), PF (parità), OF (overflow), AF (auxiliary carry).
JMP Addr
Salta incondizionatamente all'indirizzo Addr.Addr può essere un etichetta (sostituita poi dal compilatore da un indirizzo relativo) o da un indirizzo assoluto.
Jcc Addr
Salto condizionale.Salta ad Addr se la condition code CC è vera. Forme particolari sono:
- JCXZ: salta ad Addr se CX=0
- JECXZ: salta ad Addr se ECX=0
Negli ultimi due casi, Addr deve essere obbligatoriamente un indirizzo relativo a 8 bit.
LOOP
Addr
- Istruzione utilizzata e compatta per l'esecuzione di cicli.
- La variabile contatore è obbligatoriamente ECX.
- Addr è per forza un indirizzo relativo a 8 bit.
Funzionamento:
- ECX viene decrementato automaticamente di 1.
- ECX viene controllato automaticamente.
- Se il valore di ECX è diverso da 0 salta ad Addr.
Siamo costretti a contare all'indietro.
LOOPcc
Addr
Funziona come il LOOP ma ha un'ulteriore condizione di fine ciclo determinata da cc.
Esegue il ciclo se ECX ≠ 0 e se cc è falsa.
Occorre fare attenzione ad entrare in LOOP/LOOPcc con ECX ≠ 0! Per fare ciò posso usare l'istruzione
che controlla se ECX è uguale a zero e, in caso, salta ad Addr.
CALL
Addr
Esegue un sottoprogramma a partire da Addr.
Prima di eseguire il "salto ad Addr" CALL memorizza il valore di EIP (all'istruzione successiva del main) nello stack (PUSH EIP).
RET
Istruzione di ritorno al programma chiamante.
Non è necessario specificare l'indirizzo di ritorno (per questo è possibile utilizzare il sottoprogramma diverse volte, in posizioni differenti in memoria).
Tramite una POP EIP sullo stack il controllo torna all'istruzione chiamante.
-
MATLAB - istruzioni d'uso
-
Endocrinologia - le istruzioni del paziente diabetico
-
Elettronica Analogica -Librerie Orcad istruzioni
-
Spiegazione delle istruzioni e comandi principali di JAVA