Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
IMUL
IMUL esegue moltiplicazione intera con segno (gli operandi sono in complemento a 2). A differenza di MUL il cui formato prevede un solo operando, IMUL prevede tre formati:
- IMUL SRC
- IMUL DST,SRC // DST = DST * SRC
- IMUL DST,SRC1,SRC2 // DST = SRC1 * SRC2
Nel primo caso il funzionamento è analogo a MUL per quanto riguarda i registri utilizzati; nel secondo caso SRC può essere anche un valore immediato; nel terzo caso SRC2 è obbligatoriamente un valore immediato.
DIV SRC
Divisione senza segno; analogamente a MUL si comporta in modo diverso in base alla dimensione dell'operando SRC (divisore). In particolare il divisore, il quoziente e il resto sono prelevati/scritti differentemente in base alla dimensione 8, 16 o 32 bit di SRC. Se SRC = 0 viene generato errore run-time.
IDIV
Equivalente a DIV ma gli operandi sono con segno.
AND/OR/XOR DST,SRC
AND/OR/XOR logico bit a bit; il risultato viene sovrascritto su DST.
SAL/SAR DST,#
Shift aritmetico bit a bit a sinistra/destra in
DST di un numero di bit specificato dal secondo operando. Aritmetico significa equivalente a una moltiplicazione per 2 (SAL) o divisione per 2 (SAR). Può essere un valore immediato a 8 bit (solo i valori da 0 a 31 sono ammessi) oppure il registro CL. Nel caso di shift a sinistra (SAL), per ogni shift atomico (1 posizione), il bit meno significativo assume valore 0, mentre il bit più significativo (che fuoriesce) finisce in CF. Nel caso di shift a destra (SAR), per ogni shift atomico (1 posizione), il bit meno significativo fuoriesce e finisce in CF, mentre il bit più significativo MSB estende il segno (stesso valore del precedente MSB). SHL/SHR DST,#Shift logico bit a bit a sinistra/destra in DST di un numero di bit specificato dal secondo operando. Logico significa scorrimento puro senza estensione del segno. # può essere un valore immediato a 8 bit (compreso tra 0 e 31) oppure il registro CL. SHL opera in modo identico a SAL (hanno lo stesso OP-CODE), mentre SHR.a differenza di SAR non estende il bit di segno ma pone a 0 l'MSB entrante. Un'applicazione importante dello scorrimento è la moltiplicazione e la divisione per potenze di 2. Se un intero positivo viene fatto scorrere di k bit verso sinistra allora, a meno di overflow, il risultato rappresenta il numero iniziale moltiplicato per 2^k. Se un numero positivo viene fatto scorrere verso destra di k bit, si ottiene il numero iniziale diviso per 2^k. Se si vuole esaminare una parola bit per bit, la si può ruotare di 1 bit alla volta (non importa in che direzione) ed esaminare a ogni passo il contenuto del bit di segno; dopo aver esaminato tutti i bit la parola risulta ripristinata nella sua forma originale.ROL/ROR DST,#
Rotazione logica bit a bit a sinistra/destra in DST di un numero di bit specificato dal secondo operando.
# può essere un valore immediato a 8 bit (solo i valori da 0 a 31 sono ammessi) oppure il registro CL.
Nel caso di rotazione a sinistra (ROL), perOgni rotazione atomica (1 posizione), il bit più significativo fuoriesce ma rientra a destra diventando il nuovo bit meno significativo. Nel caso di rotazione a destra (ROR), per ogni rotazione atomica (1 posizione), il bit meno significativo fuoriesce ma rientra a sinistra diventando il bit più significativo.
Operazioni unarie:
INC DST
: Incrementa di 1 il valore specificato da DST (senza alterare il flag CF). Utilizzato in genere nei cicli. Se DST ha raggiunto il valore massimo (es. EAX = ffffffffh) l'istruzione di incremento causa traboccamento e quindi la destinazione assume valore 0. L'unico flag utilizzabile per verificare il traboccamento è ZF.DEC DST
: Decrementa di 1 il valore specificato da DST (senza alterare il flag CF). Utilizzato in genere nei cicli. Per verificare underflow (traboccamento sotto lo zero) può essere utilizzato il flag di segno SF.
Confronti e salti:
TEST SRC1,
SRC2 esegue l'AND logico di SRC1 e SRC2; il risultato non viene scritto da nessuna parte ma viene utilizzato per l'impostazione dei flag SF, ZF e PF nel registro EFLAGS.
- SF viene impostato al valore del bit più significativo del risultato.
- ZF viene impostato se il risultato è 0.
- PF viene impostato se il byte meno significativo del risultato ha parità pari.
Tramite questa istruzione è ad esempio possibile decidere di saltare quando alcuni bit di un certo registro o variabile in memoria sono impostati a 1 o a 0; in questo caso SRC2 viene utilizzato come maschera (valore immediato).
CMP SRC1, SRC2 esegue la sottrazione SRC1-SRC2; il risultato non viene scritto da nessuna parte ma viene utilizzato per l'impostazione dei flag CF, SF, ZF, PF, OF, AF nel registro EFLAGS.
JMP Addr esegue un salto incondizionato a Addr; il salto viene in pratica eseguito caricando in EIP (Extended Instruction Pointer) l'indirizzo Addr.
Jcc, JCXZ e JECXZ Addr Salta
All'indirizzo Addr se e solo se la condition code cc determinata a partire dai flag impostati con l'istruzione(solitamente) precedente è vera.
Esistono altre due versioni di Jcc dove cc non si riferisce ai condition code determinati dai flag:
- JCXZ Addr: salta ad Addr se CX = 0
- JECXZ Addr: salta ad Addr se ECX = 0
Istruzioni di ciclo
Poiché capita spesso di dover eseguire un gruppo d'istruzioni un numero prefissato di volte, molte macchine dispongono d'istruzioni per facilitare questo compito. Tutti gli schemi prevedono un contatore che viene incrementato o decrementato di una certo valore costante a ogni iterazione del ciclo. Il contatore viene anche esaminato a ogni iterazione; il ciclo termina quando si verifica una certa condizione.
LOOP
Si tratta di un'istruzione compatta e ottimizzata per l'esecuzione di cicli dove per la variabile contatore viene usato obbligatoriamente il registro ECX. Addr può essere solo un indirizzo
relativo a 8 bit.
LOOP Addr: il registro ECX viene decrementato automaticamente di un'unità, il valore di ECX viene controllato, se ECX è diverso da 0 salta ad Addr.
LOOPcc Addr: continua a ciclare fino a quando ECX è diverso da 0 e la condizione cc è vera. Pertanto due eventi possono causare l'uscita dal ciclo (è sufficiente che se ne verifichi uno): ECX = 0 oppure cc falsa.
Chiamata di procedura CALL Addr e RET: esecuzione di un sottoprogramma a partire dall'indirizzo Addr. Il sottoprogramma termina con un'istruzione RET, a seguito della quale il controllo ritorna al programma chiamante che continua l'esecuzione all'istruzione successiva rispetto alla chiamata.
L'istruzione CALL prima di eseguire il salto memorizza il valore di EIP nello stack, ovvero esegue un PUSH EIP sullo stack. Ciò può essere verificato notando che il valore di ESP cambia a seguito di CALL e sullo stack viene caricata una DWORD.
equivalente a EIP. Quando il sottoprogramma termina (RET
), un'istruzione POP EIP
causa il ritorno al punto desiderato. Non è possibile manipolare EIP direttamente con istruzioni del tipo MOV EIP, EAX
.
Manipolazione di stringhe
Le stringhe sono sequenze contigue di caratteri (byte), molto utilizzate in tutti i linguaggi di programmazione. Risulta spesso necessario eseguire operazioni su stringhe. L'approccio tradizionale consiste nel trattare le stringhe come vettori di byte e accedere a essi con le istruzioni comuni.
Il Pentium mette a disposizione una serie di istruzioni ottimizzate per la manipolazione di stringhe. In realtà queste istruzioni operano indipendentemente dalla rappresentazione ASCII dei caratteri e trattano gli elementi come byte; pertanto sarebbe più appropriato parlare di "manipolazione di blocchi contigui di memoria".
Le operazioni su stringhe utilizzano obbligatoriamente due registri dedicati: ESI (Extended Source Index) e...
EDI
(Extended Destination Index) che vengono utilizzati come indirizzo dell'elemento corrente nella stringa sorgente o destinazione rispettivamente.
LODS
Leggi stringa
STOS
Scrivi stringa
MOVS
Copia stringa
CMPS
Confronta due stringhe
SCAS
Esamina stringa
STD
Imposta il flag DF a 1 (scorrimento stringa indietro)
CLD
Imposta il flag DF a 0 (scorrimento stringa in avanti)
Il prefisso REP
o REPcc
anteposto ad una di queste istruzioni consente di eseguire un ciclo sulla stringa: la lunghezza della stringa deve essere specificata dal registro ECX. Il registro ESI o EDI (o entrambi) viene automaticamente incrementato o decrementato (a seconda del flag DF in EFLAGS).
Unità Floating Point (cenni)
L'unità floating point (incorporata all'interno del chip del Pentium) utilizza una serie di registri aggiuntivi.
Gli 8 registri R0..R7, benché accessibili singolarmente senza nessuna restrizione sull'ordine, vengono trattati come uno stack sul quale le operazioni di caricamentoE prelevamento aggiungono o rimuovono valori rispetto al TOP dello stack.
ST(0) si riferisce al registro 0 a partire da TOP (non necessariamente R0).
ST(1)..ST(7) sono i successivi registri sullo stack.
L'unità floating point fornisce molte istruzioni (più di 50) che possono essere raggruppate sulla base delle loro funzioni in:
- Trasferimento di valori: per caricare (FLD), salvare (FST), spostare, ... valori nei registri ST(0)..ST(7).
- Aritmetiche di base: somma (FADD), sottrazione (FSUB), moltiplicazione (FMUL), divisione (FDIV), radice quadrata (FSQRT), ...
- Confronto: non è possibile confrontare con la tradizionale CMP valori floating point; sono quindi necessarie operazioni di confronto dedicate come (FCOM).
- Funzioni transcendenti: seno (FSIN), coseno (FCOS), logaritmo (FYL2X), esponenziale (F2XM1), ...
- Caricamento di costanti note: carica costanti quali 0, 1, π, e, ... nei registri senza dover caricarne il valore dalla memoria.
Partire