Modalità di indirizzamento in Linguaggio Assembly (IA-32 NASM)

Come risorse web su questo è scarsa, io, per il beneficio delle future ricerche, iniziare elencando l’indirizzo modalità per IA-32 Linguaggio Assembly (NASM) e poi seguire con una domanda veloce.

  1. Registro di indirizzamento
    • mov eax, ebx: Copie di ciò che è in ebx in eax
    • mov esi, var: Copia l’indirizzo del var (dire 0x0040120e) in esi
  2. Indirizzamento immediato (secondo operando è un immediato costante)
    • mov bx, 20: 16-bit registro bx ottiene il valore effettivo 20
  3. Diretto indirizzamento di memoria (carica direttamente dalla memoria attraverso un indirizzo specificato)
    • mov ax, [1000h]: consente di caricare un oggetto a 2 byte da il byte all’indirizzo 4096 (0x1000 in esadecimale) a 16-bit registro chiamato ‘ax’
    • mov [1000h], ax: memoria all’indirizzo 1000h ottiene il valore di ax
  4. Per la stampa diretta di indirizzamento (uguale al 3, usando solo l’aritmetica per modificare l’indirizzo)
    • mov al, [byte_tbl+2]
  5. Indiretta di registro (memoria di accesso utilizzando gli indirizzi memorizzati in registri)
    • mov ax, [di]: copia il valore all’indirizzo di memoria specificato da di, in ax
    • mov dword [eax], var1: copia il valore in var1 in slot di memoria specificato da eax

Si prega di notare che quanto sopra è per NASM. MASM/TASM devi utilizzare “mov esi, OFFSET pippo” per ottenere l’indirizzo, mentre “mov esi, foo” e “mov esi, [pippo]” sia otterrà il valore (creds a @Michael).

Così, su mia domanda. È in relazione a un esempio in fondo alla pagina 29 del seguente tutorial: http://www.tutorialspoint.com/assembly_programming/assembly_tutorial.pdf

Sostanzialmente elenca il codice di seguito un esempio di indiretta indirizzamento di memoria.

MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0 
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX 
MOV [EBX], 110 ; MY_TABLE[0] = 110 
ADD EBX, 2 ; EBX = EBX +2 
MOV [EBX], 123 ; MY_TABLE[1] = 123 

Le mie domande:

  1. Non dovrebbe “MOV EBX, [MY_TABLE]”, infatti, essere “MOV EBX, MY_TABLE”, come si desidera inserire l’indirizzo della tabella in EBX, non il valore stesso?
  2. Sicuramente è MY_TABLE[2], che è pari a 123 alla fine, non MY_TABLE[1]?
  • Il web le risorse sono scarse?! Intel manuale spiegare tutto in dettaglio.
  • Ho fatto un po ‘ di ricerca e non credo che era dritto in avanti per trovare un elenco con esempi semplici, in particolare uno che ha l’esempio nella seconda sub-proiettile per il primo punto principale. Quindi nel caso in cui qualcuno si trova nelle mie scarpe, sono confusi dalla differenza tra il NASM/MASM/TASM su questo argomento, si potrebbe trovare il riassunto utile.
  • Vedi anche stackoverflow.com/a/34058400/224132 per una carrellata sulle modalità di indirizzamento. E altri link stackoverflow.com/tags/x86/info
  • Grazie mille! Intel va su questa profondità, ma questa semplice spiegazione mi ha aiutato molto.
  • Il tutorial non è valido NASM codice. MOV [EBX], 110 non montare perché nessuno dei due operandi implica un operando di dimensioni. (Penso che anche MASM non montare.)
InformationsquelleAutor Magnus | 2013-12-16

 

2 Replies
  1. 6
    1. In NASM sintassi, che l’istruzione dovrebbe essere MOV EBX, MY_TABLE. Cosa MOV EBX, [MY_TABLE] vorresti fare è caricare i primi 4 byte all’ MY_TABLE in EBX. Un’altra alternativa sarebbe quella di utilizzare LEA, come in LEA EBX, [MY_TABLE].

    2. In questo caso la guida è a destra. MY_TABLE è definito come un array di parole. Una parola su x86 è di 2 byte, quindi il secondo elemento di MY_TABLE infatti, è situato a MY_TABLE + 2.

    • 1. Non è possibile caricare i primi 4 byte, perché l’istruzione mov sempre copie 32 bit su IA-32? Perché è che? 2. Ah, così fa +2 significa aggiungere 2 byte?
    • 1. Carica 4 byte, perché il registro destinazione è EBX, che è di 4 byte. 2. Destra. Se MY_TABLE era situato all’indirizzo 0 e hai fatto MOV EBX, [MY_TABLE+2] saresti la lettura di DWORD a partire dall’indirizzo 2. Non c’è implicita scala di offset come in C.
    • Ma, se si scorre verso l’alto nella stessa pagina del pdf tutorial si dice che word_table+3 dà anche elemento 4. È che non è giusto, allora?
    • Sì, WORD_TABLE+3 non sarebbe il 4 ° elemento di WORD_TABLE.
    • Oh uomo, questo libro è ricco di errori sembra…
    • Potete dare un’occhiata a questo? stackoverflow.com/questions/29708532/…

  2. 0

    Che il tutorial non è nemmeno valido NASM codice. Per i collegamenti a x86 guide /risorse /manuali che non succhiare, vedere x86 tag wiki qui su so.

    MOV [EBX], 110 non montare perché nessuno dei due operandi implica un operando di dimensioni. (Penso che anche MASM non montarlo, ma alcune cattive assemblatori come emu8086 predefinito dimensione dell’operando per istruzioni come questo.) mov word [ebx], 110 farebbe un 16-bit store.

    MOV EBX, [MY_TABLE] raccoglierà ma carica le prime 2 parole da tavolo. mov ebx, MY_TABLE sarà messo l’indirizzo nel registro.

Lascia un commento