Estratto del documento

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

  1. IMUL SRC
  2. IMUL DST, SRC             DST = DST * SRC
  3. 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.

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