Domanda

C'è qualcosa che io non riesco a digerire.Sto imparando alcune assembler e in questo momento sono al capitolo di affrontare.Capisco il concetto di staffe per la risoluzione dei riferimenti, ma in qualche modo quando vedo che l'uso di esso non posso prendere il punto.Per essere un po ' più precisa, qui è dove la mia confusione è iniziato:

mov al, [L1]

Qui suppongo L1 come un caso di esempio è un tipo di macro che, successivamente, sostituito per un vero e proprio indirizzo in codice macchina, giusto?

Così che cosa questa istruzione non è:la dereferenziazione al registro (perché non si potrebbe cambiare indirizzo fisico) e modificare il valore con quello memorizzato in L1.

Se fino ad ora tutto è ok:

mov [L1], al

che sarebbe analogicaly dire, ci deve essere stato un indirizzo memorizzato (così ci fu qualche punto nel fare questo) e si modifica in qualche altro luogo della memoria, giusto?

Se si può solo dire che mi è ok nel caso in cui non vedi errori, si prega di farlo, che sarebbe possibile per me continuare a imparare.

Un'ultima cosa, NASM aggiunge un sacco di 0xAA55 sotto il mio codice (questa sequenza è dovuto terminare il programma giusto?), perché ci sono così tante volte?

È stato utile?

Soluzione

L1 è in genere/probabilmente un etichetta, associato con un particolare indirizzo in memoria.Il programmatore definisce diverse etichette, per sua comodità, e le etichette sono utilizzate per rappresentare simbolicamente una particolare posizione in memoria (L1 è un pessimo nome;le etichette sono in genere indicativo del sottostante scopo della posizione:dire, PingCounter, Messaggio, di Accesso e simili).

Un'etichetta per 1 byte di memoria statica è come un compilatore C di mettere in atto char L1; in ambito globale.


In NASM sintassi, mov edi, L1 si riuniranno, per la mov eax, imm32 forma di mov, cioèl'indirizzo di etichetta diventerà un 32-bit immediato in codice macchina.(L'assembler non conosce il finale valore numerico, ma il linker fa.) Attenzione che in MASM sintassi, questo sarebbe un carico e avresti bisogno mov edi, OFFSET L1 per ottenere un indirizzo di etichetta come immediata.

Ma mov al, [L1] si riuniranno, per un'istruzione diversa, con l'indirizzo a 32 bit incorporato nel codice macchina di un indirizzo a annullare.Questa istruzione carica 1 byte dall'indirizzo L1, e la pone in AL.

In linguaggio assembly, questa la modalità di indirizzamento indiretto è rappresentato da piazza bracketing l'origine o la destinazione operando di una istruzione.(Ma non entrambi:solo x86 supporta al massimo una memoria esplicita operando per l'istruzione.)

mov al, [L1]

utilizza l'indirizzo memorizzato in L1, di localizzare la posizione in memoria e legge 1 byte (= 8 bit = la dimensione del registro AL) in questa posizione, e la carica nel registro AL.

  mov [L1], al

Questo in senso inverso.cioè, in particolare, di leggere l'indirizzo memorizzato in L1, utilizzare questo indirizzo per trovare un posto particolare nella memoria e memorizza il contenuto del registro AL ci.


Condizione di comprendere le seguenti informazioni siano incomplete e un po ' datato, per quanto riguarda i più recenti processori della famiglia x86, questo primer sull'architettura 8086 probabilmente è molto utile per ottenere iniziato con il linguaggio Assembly x86 famiglia.
Il vantaggio di partire con questo "antichità di una CPU" (ancora in uso, in realtà), è che i concetti fondamentali ci sono tutti, senza tener conto della più recente serie di registri, di fantasia modalità di indirizzamento, modalità di funzionamento e di altri concetti.Il più grande di dimensioni, caratteristiche e modalità delle nuove Cpu soltanto di introdurre un esplosione combinatoria di opzioni, tutte (la maggior parte?) dei loro utili nel loro modo, ma sostanzialmente irrilevanti per un'iniziazione.

Altri suggerimenti

E 'difficile da seguire tua domanda, ma cercherò di dare una mano.

In assemblea, un simbolo è solo un nome per un indirizzo. Nella vostra sorgente assembly, L1 è un simbolo definito altrove, che l'assemblatore risolverà come offset alla memoria.

Quando si dereferencing (usando la notazione []), è possibile dereferenziare un registro (come in "al mov, [esi]") o un indirizzo (come in "mov al, [L1]"). Entrambe le affermazioni fanno la stessa cosa, l'unica differenza è dove l'indirizzo proviene.

Vi consiglio di scaricare il Intel documentazione CPU e sfogliando il riferimento di istruzioni. Se non si vuole essere sopraffatto, iniziare la lettura da un vecchio processore x86 (per esempio, 486 o più anziani), che la documentazione non è esattamente cordiale, ma è molto utile avere a portata di mano.

Non so le specifiche di NASM, ho imparato il montaggio di 15 anni fa con Turbo Assembler, e che la conoscenza è ancora utile oggi:)

Inoltre, potrei suggerire di provare googling per "x86 assemblaggio tutorial", troverete un sacco di documentazione rilevante che può essere utile per voi.

  

oh e un'ultima cosa, NASM aggiunge un   mucchio di 0xAA55 sotto il mio codice (questo   la sequenza dovrebbe porre fine alla   programma giusto?), perché c'è così   molte volte? grazie mille per   leggerla a qui ..

Sono abbastanza sicuro che questo è applicabile solo se la vostra creazione di un bootloader. E 'la "firma di avvio." Diciamo che scrive questo codice per un floppy (è il codice macchina prodotta anche esattamente 512 byte?), Bene quando si desidera avviare il computer con questo codice bootloader, il BIOS cerca nella floppy e determinare se si tratta di un bootloader reale. Per fare ciò, esaminerà gli ultimi due byte del primo settore del disco magnetico, che dovrebbe essere 0xAA55 per indicare che è avviabile .. (anche, questo funziona allo stesso modo se il vostro boot off di hard disk, o thumb-drive, o qualsiasi altra cosa. Un po 'diverso per i CD perché hanno 4096 settori byte)

Nel codice sorgente, è come l'ultima linea qualcosa come $(times.. db 0xAA55 o qualcosa del genere? Se il tuo non con l'intenzione di fare un bootloader, è possibile rimuovere in modo efficace quella linea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top