Che cosa significa la staffa in `movl (% eax),% eax` media?
Domanda
Googled abbastanza, ma non riuscivo a capire cosa i mezzi ()
staffa. Inoltre, vedo un po 'come la sintassi movl 8(%ebp), %eax
Potrebbe qualcuno qualcuno mi può suggerire qualche riferimento buono? Non sono stato in grado di trovare qualsiasi tra i primi 20 risultati di Google.
Soluzione
%eax
è il registro EAX; (%eax)
è la locazione di memoria il cui indirizzo è contenuto nel registro EAX; 8(%eax)
è la locazione di memoria il cui indirizzo è il valore di EAX più 8.
Altri suggerimenti
http: //web.archive .org / web / 20080215230650 / http: //sig9.com/articles/att-syntax è veloce introduzione sintassi asm Unix (AT & T). Googled da at&t asm syntax
.
Il post è "AT & T Assemblea di sintassi" da Vivek ( http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek ), 2003-09-01. C'è informazioni principale su AT & T da esso:
Ad esempio, il formato generale di un'istruzione di base movimento di dati in INTEL-sintassi è,
mnemonic destination, source
che, nel caso di AT & T, il formato generale è
mnemonic source, destination
(mi ricordo questo ordine come chiamare AT & T asm come autentiche asm Unix, quindi è destro uno, e flussi di dati verso destra, mentre la sintassi Intel si basava su alcune inesatte masms doc, che sono chiaramente non è giusto per il mondo Unix, sono sinistra e flussi di dati verso sinistra)
Tutti i nomi di registro dell'architettura IA-32 deve essere preceduto da un segno '%', ad es. % Al,% bx,% ds,% CR0 etc.
Tutti i valori letterali deve essere preceduto da un segno '$'. Ad esempio,
mov $100, %bx mov $A, %al
La prima istruzione sposta il valore 100 nel registro AX e il secondo si muove il valore numerico della ASCII A nel registro AL.
Nel AT & T sintassi, la memoria viene fatto riferimento nel seguente modo,
segment-override:signed-offset(base,index,scale)
parti di cui può essere omessa in base all'indirizzo che si desidera>% es:. 100 (% eax,% ebx, 2)
Si prega di notare che gli spostamenti e la scala non devono essere preceduti da '$'. Alcuni esempi più con i loro equivalenti NASM-sintassi, dovrebbe rendere le cose più chiare,
GAS memory operand NASM memory operand ------------------ ------------------- 100 [100] %es:100 [es:100] (%eax) [eax] (%eax,%ebx) [eax+ebx] (%ecx,%ebx,2) [ecx+ebx*2] (,%ebx,2) [ebx*2] -10(%eax) [eax-10] %ds:-10(%ebp) [ds:ebp-10] Example instructions, mov %ax, 100 mov %eax, -100(%eax)
Operando Formati. A volte, soprattutto quando si spostano valori letterali di memoria, diventa necessario da specificare la dimensione trasferimento-di-o dell'operando-size. Per esempio l'istruzione,
mov $10, 100
solo specfies che il valore 10 deve essere spostata nella memoria di correzione 100, ma non la dimensione di trasferimento. In NASM questo viene fatto aggiungendo la parola chiave byte / parola fusione / DWORD ecc qualsiasi operandi. Nella sintassi AT & T, questo viene fatto aggiungendo un suffisso - b / w / l - le istruzioni. Ad esempio,
movb $10, %es:(%eax)
muove un valore di byte 10 alla posizione di memoria [EA: eax], considerando che,
movl $10, %es:(%eax)
muove lungo un valore (DWORD) 10 nello stesso posto.
Il JMP, chiamata, ret, ecc, istruzioni trasferire il controllo da una parte di un programma ad un altro. Essi possono essere classificati come trasferimenti di controllo allo stesso segmento di codice (vicino) oa segmenti di codice diversi (lontano). I possibili tipi di ramo di indirizzamento sono -. Offset relativo (etichetta), registro, memoria operando, e del segmento-offset puntatori
Offset relativi, vengono specificati utilizzando le etichette, come illustrato di seguito.
label1: . . jmp label1
Branch indirizzamento utilizzando registri o operandi di memoria deve essere preceduto da un '*'. Secondo un "lontani" tranfers controllo, una 'l' devono essere preceduti, come in 'LJMP', 'LCALL', ecc Per esempio,
GAS syntax NASM syntax ========== =========== jmp *100 jmp near [100] call *100 call near [100] jmp *%eax jmp near eax jmp *%ecx call near ecx jmp *(%eax) jmp near [eax] call *(%ebx) call near [ebx] ljmp *100 jmp far [100] lcall *100 call far [100] ljmp *(%eax) jmp far [eax] lcall *(%ebx) call far [ebx] ret retn lret retf lret $0x100 retf 0x100
puntatori segmento-offset sono specificati utilizzando il seguente formato:
jmp $segment, $offset
Si raccomanda, inoltre, gnu come (gas) docs: http://web.archive.org/web/20080313132324/http://sourceware.org/binutils/docs-2.16/as/index.html
Sono mossa istruzioni, lo spostamento dei dati da un luogo ad un altro - in questi casi, dalla memoria in un registro:
register_eax = *(unsigned long *)register_eax;
Il tuo altro esempio è qualcosa di simile:
register_eax = *(unsigned long *)(register_ebp + 8);