Estratto del documento

Istruzioni Assembly

MOV, PUSH, POP, XCHG, LEA e CMOV

MOV DST, SRC
Copia SRC in DST.
Non posso copiare direttamente da memoria a memoria.

PUSH SRC
Inserisce SRC in cima allo stack.
Decrementa ESP (Stack Pointer) di tanti byte quanti ne contiene SRC.

POP DST
Preleva un valore dalla cima dello stack di grandezza dipendente da DST.
Incrementa 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, SRC
Carica in DST l'indirizzo di memoria di SRC.
Sfruttato anche per eseguire operazioni aritmetiche più o meno complesse. Ad esempio:
LEA EAX, [EBX*2+10] equivale a:
EAX = EBX*2+10.

CMOVcc DST, SRC
Copia 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, PUSH, POP, XCHG, LEA e CMOV

MOV DST, SRC
Copia SRC in DST.
Non posso copiare direttamente da memoria a memoria.

PUSH SRC
Inserisce SRC in cima allo stack.
Decrementa ESP (Stack Pointer) di tanti byte quanti ne contiene SRC.

POP DST
Preleva un valore dalla cima dello stack di grandezza dipendente da DST.
Incrementa 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, SRC
Carica in DST l'indirizzo di memoria di SRC.
Sfruttato anche per eseguire operazioni aritmetiche più o meno complesse. Ad esempio:
LEA EAX, [EBX*2+10] equivale a:
EAX = EBX*2+10.

CMOVcc DST, SRC
Copia il valore SRC in DST solo se la condizione cc risulta verificata.
Tutte le operazioni devono essere eseguite tra registri e variabili/registri con la stessa dimensione.

Operazioni aritmetiche

ADD DST, SRC
Somma SRC a DST salvando su DST.

SUB DST, SRC
Sottrae SRC a DST e salva su DST.

MUL SRC
Moltiplicazione 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.

IMUL
Moltiplicazione 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 SRC
Divisione senza segno.
SRC 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 SRC
Divisione con segno.
A parte il segno resta uguale a DIV.

CDQ
Estende il registro a 64 bit su EDX:EAX.
Non ha operandi.

INC DST
Incrementa di 1 DST.
Più efficiente di ADD DST, 1.
Overflow aritmetico se ZF = 1.

DEC DST
Decrementa di 1 DST.
Più efficiente di SUB DST, 1.
Underflow è verificabile se SF = 1.

NEG DST
Cambia il segno a DST.

Operazioni logiche

ADD DST, SRC
Aggi 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, SRC
Or bit a bit con salvataggio su DST.
Il bit è uguale a 0 solo se i due bit di partenza erano a 0.

XOR DST, SRC
Xor 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.

Shift e rotazioni

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 e confronto

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

Salti e cicli

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.

Chiamate e ritorni

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.

Anteprima
Vedrai una selezione di 3 pagine su 7
Istruzioni assembly Pag. 1 Istruzioni assembly Pag. 2
Anteprima di 3 pagg. su 7.
Scarica il documento per vederlo tutto.
Istruzioni assembly Pag. 6
1 su 7
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher eleonora.guidi6 di informazioni apprese con la frequenza delle lezioni di Architetture degli elaboratori e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Bologna o del prof Maltoni Davide.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community