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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top