2009-08-18 17 views
6

Considerate questo codice assembly x86:Dereferenziare un'etichetta in assembly x86

section .data 

foo: 
    mov ebx, [boo] 
    mov [goo], ebx 
goo: 
    mov eax, 2 
    mov eax, 3 
    ret 
boo: 
    mov eax, 4 
    mov eax, 5 
    ret 

Che cosa sta succedendo qui? Quando rinuncio a [boo] e mov a [goo] cosa esattamente mi sto muovendo lì? Un solo comando? Lo ret pure?


di follow-up domande:

  1. Vuol dereferencing un'etichetta darmi un indirizzo? O il codice macchina per il primo comando nell'etichetta?
  2. Se si tratta di un codice macchina, come può essere più di un comando? Non tutti i comandi sono essenzialmente a 32 bit (anche se non vengono utilizzati tutti i bit)?
  3. Bottom line - eax ha un valore di 3 o 5 alla fine?

risposta

9

boo è l'offset dell'istruzione mov eax, 3 all'interno della sezione .data. mov ebx, [boo] significa "recupera quattro byte all'offset indicato da boo all'interno di ebx". Allo stesso modo, mov [goo], ebx sposterebbe il contenuto di ebx all'offset indicato da goo.

Tuttavia, il codice è spesso di sola lettura, quindi non sarebbe sorprendente vedere il codice solo in crash.

Ecco come le istruzioni sul boo sono codificati:

boo: 
b8 03 00 00 00   mov eax,0x3 
c3      ret 

Quindi, quello che si ottiene in ebx è in realtà 4/5 dell'istruzione mov eax, 3.

+1

Sembra che questo accade a lavorare perché non sono pieno quantità a 32 bit e la l'ultimo byte sarà sempre 0. Questo codice fallirà se si prova qualcosa come mov, eax 0xC000000 – Michael

+0

"recuperare i quattro byte" era quello che stavo cercando. Grazie! –

3

Il primo movimento viene copiato dall'offset goo relativo al registro segmenti [e] DS. Il secondo mov scrive sull'offset di foo in una posizione dati relativa al registro DS. Se CS e DS sono casuali, questo può essere ignorato. Supponendo che CS e DS siano casuali, è probabile che tu possa imbattersi in vari meccanismi di protezione che rendono le sezioni di codice di sola lettura.

followups RE:

  1. Un isnt etichetta come un punto di riferimento - tu non dereference in quanto tale. L'assemblatore sostituisce un numero che rappresenta la posizione nel codice risultante. Puoi caricare l'indirizzo o la cosa all'indirizzo. Il [e] indicano il dereferenziamento - Ho risolto un elemento di confusione nella mia prima risposta per coprire questo. IOW che fa [goo] carica la cosa a quell'indirizzo.
  2. Un'istruzione CISC impostata come x86 ha istruzioni di lunghezza [molto] variabile - alcune addirittura non un multiplo della lunghezza della parola. Generalmente, i RISC tentano di risolvere questo per semplificare le istruzioni di decodifica.
  3. 3 - si stanno modificando solo i primi 4 byte dello mov eax, 2 (che, a causa della codifica little endian, viene sostituito con 4 ma poi viene sovrascritto dall'istruzione successiva che non è stata affatto modificata - 5 non è mai nel foto come candidato (pensavo avessi pensato che il codice venisse riordinato nel modo in cui hai prima posto la domanda [1] anche se sai chiaramente un po 'di più come avrei dovuto indovinare dal tuo rappresentante: P)]).

Nota che tutto ciò presuppone che CS = DS e DEP è neanche un passo dentro.

Inoltre, se si sta utilizzando BX invece di EBX, il genere di cose che ti aspettavi entrerà in gioco (utilizzando xX invece di ExX accede ai 2 byte bassi del registro [e xL accede al byte più basso])

[1] Ricorda che un assemblatore è puramente uno strumento per scrivere opcode - roba come etichette, ecc. Tutto si riduce a numeri ecc. con pochissime trasformazioni magiche o impressionanti del codice - non ci sono chiusure o qualcosa di profondo in quella natura che si annida qui dentro. (Questo è leggermente Semplificando - codice può essere rilocabile, e in molti casi correzioni applicate ai usi di offset da una combinazione di linker e il caricatore)

+0

destra - ero con RISC in mente ... grazie per chiarire quel punto –

2

follow-up risposte:

  1. Ti dà il codice macchina a partire dall'indirizzo. Quanto dipende dalla lunghezza del carico, in questo caso è 4 byte.

  2. Può essere più di un comando o solo un frammento di un comando. Su questa architettura (Intel x86) i comandi del codice macchina sono compresi tra 8 e 120 bit.

  3. 3.

Problemi correlati