2012-10-13 13 views
6

Eventuali duplicati:
What’s the purpose of the LEA instruction?
LEA instruction?difficoltà comando di capire "indirizzo effettivo carico"

Così sto lavorando su l'assegnazione bomba a binario per la classe (che ha un mucchio di fasi in cui devi passare attraverso il codice assembly di un programma e trovare una passphrase per decodificare la "bomba").

Non riesco a completare la fase corrente perché non capisco il comando lea. Ho letto che è comunemente usato per l'aritmetica, ma semplicemente non capisco come funziona.

Il comando che sto guardando in particolare, è

lea -0x18(%ebp), %ebx 
lea -0x8(%ebp), %esi 

seguito da un

mov -0x4 (%ebx), %eax 
add -0x8(%ebx), %eax 

nella riga successiva eax e ebx sono confrontati, se sono uguali il programma continua, altrimenti la bomba esplode.

Ho capito abbastanza su questa fase per sapere che vuole 6 numeri, i primi due sono 0 e 1. Dopo di ciò, fa alcune manipolazioni per determinare se il resto della sequenza è corretto (sto assumendo il i comandi lea sono ciò che ho bisogno di decodificare per trovare i numeri successivi).

Ora quello che non ho potuto trovare è ciò a cui si riferisce in particolare -0x18. cosa fa il segno negativo? indica sottrazione? sta guardando 18 byte prima di ebp?

Grazie per qualsiasi aiuto qui.

risposta

14

L'istruzione LEA calcola un indirizzo di memoria utilizzando la stessa aritmetica che un'istruzione MOV utilizza. Ma diversamente dall'istruzione MOV, l'istruzione LEA memorizza semplicemente l'indirizzo calcolato nel suo registro di destinazione, invece di caricare il contenuto di quell'indirizzo e di memorizzarlo.

Considerate la vostra prima istruzione LEA:

lea -0x18(%ebp), %ebx 

Questa istruzione calcola la somma del -0x18 e il valore nel registro EBP. Ottiene qualche risultato S. Memorizza S nel registro EBX.

Nell'addend -0x18, "-" è un segno negativo e "0x" significa che è una costante esadecimale. Quindi l'addend è negativo 18 , che è -24 . Quindi questa istruzione LEA sottrae semplicemente 24 dal valore in EBP e memorizza il risultato in EBX.

Contrasto questo con la vostra istruzione MOV:

mov -0x4(%ebx), %eax 

Questa istruzione calcola la somma del -0x4 e il valore nel registro EBX. Ottiene qualche risultato S. Quindi recupera il valore della parola all'indirizzo S in memoria, ottenendo qualche valore M. Memorizza M nel registro EAX.

1

L'istruzione LEA carica l'indirizzo che verrà valutato con la particolare modalità di indirizzamento nel registro di destinazione. Considerare questi due casi:

lea -0x18(%ebp), %ebx 
mov -0x18(%ebp), %ebx 

La prima istruzione carica l'indirizzo calcolato come offset rispetto al valore attuale -0x18 dell'EBP in EBX. La seconda istruzione carica il contenuto della memoria a questo indirizzo in ebx.

L'offset negativo indica che la posizione è al di sotto dell'indirizzo in un registro e l'offset positivo indica che la posizione è sopra l'indirizzo in un registro. È comune rappresentare una memoria con l'indirizzo zero in fondo e gli indirizzi crescere verso l'alto nei disegni:

0xFFFFFFFC !_______! 
    .... 
+0x4(ebp) -> !_______! 
(ebp) ->  !_______! 
-0x4(ebp) -> !_______! 
    .... 
0x00000000 !_______! 
Problemi correlati