Operazioni logico-aritmetiche

Da Hacknowledge.

Vedremo qui gli opcode messi a disposizione dall'Assembly per le operazioni logico-aritmetiche.

  • add <term1>,<term2>. Effettua la somma fra due valori, e copia il risultato nel secondo termine passato, che dovrà essere un registro. Esempio:
movl   $1,%eax
addl   $1,%eax

Questo codice scrive in EAX il valore 1, quindi gli somma 1. EAX conterrà quindi 2.

  • sub <term1>,<term2>. Del tutto analoga alla somma come operazione, effettua la differenza. Esempio:
movl   $1,%eax
subl   $1,%eax

Questo codice scrive in EAX il valore 1, quindi gli sottrae 1. EAX conterrà quindi 0.

  • mul <term>. Effettua il prodotto fra due numeri. Attenzione: questo opcode prende un solo parametro. Infatti, il moltiplicando è sempre contenuto in EAX, e anche il risultato verrà salvato in EAX (in EDX:EAX nel caso di numeri maggiori di 2^32). Quello che va invece specificato è il moltiplicatore, che deve essere un numero contenuto in un registro. Esempio:
movl   $3,%eax
movl   $2,%ebx
mull   %ebx

In questo caso metto in EAX il valore 3 e in EBX 2. Richiamo quindi l'operatore di moltiplicazione, specificando come moltiplicatore EBX. Il programma moltiplica dunque 2 per il valore contenuto in EAX e salva il risultato in EAX, che quindi conterrà 6.

  • div <term>. Analogo a mul, effettua la divisione. La sintassi è praticamente identica. La differenza sta nel fatto che div piazza il quoziente nelle cifre meno significative di EAX, e il resto in EDX.
movl   $3,%eax
movl   $2,%ebx
divl   %ebx

In questo caso AL conterrà 1 (quoziente della divisione fra 3 e 2), e EDX conterrà 1 (resto della divisione).

  • and <term1>,<term2>. Effettua l'AND logico fra due termini e piazza il risultato nel secondo termine, che deve essere un registro.
movl   $0xe4,%eax
andl   $0xf0,%eax

Dopo l'operazione, EAX conterrà 0xe0 (risultato dell'AND fra 0xe4 e 0xf0).

  • or <term1>,<term2>. Completamente analogo all'AND, effettua l'OR logico fra due termini mettendo il risultato nel secondo termine.
  • xor <term1>,<term2>. Completamente analogo all'AND, effettua lo XOR logico fra due termini mettendo il risultato nel secondo termine. È molto usato per svuotare il contenuto di un registro, dato che lo XOR di un valore logico con se stesso ritorna sempre 0:
movl   $1,%eax
xorl   %eax,%eax   # EAX conterrà 0
  • not <term>. Calcola il complemento a 1 del valore contenuto in un registro e piazza il risultato nel registro stesso.
movl   $0x0000ffff,%eax
notl   %eax  # EAX=0xffff0000
  • shll <term1>,<term2>. Effettua uno shift a sinistra di tanti bit quanti sono indicati nel primo termine del secondo termine (che deve essere un registro) e salva il risultato in esso. Esempio:
movl   $0x0000ffff,%eax
shll   $16,%eax
# Effettuo uno shift a sinistra di 2 byte del valore contenuto in EAX,
# che alla fine conterrà quindi $0xffff0000
  • shrl <term1>,<term2>. Analogo a shl, ma effettua lo shift a destra anziché a sinistra.
Strumenti personali