2011-11-15 18 views
10

Sto seguendo questo tutorial come prima incursione in sviluppo bootloader/OS per x86 che utilizza NASM:x86 NASM 'org' significato

http://joelgompert.com/OS/TableOfContents.htm

E io sono su Lezione 4, che sta facendo il mio bootloader stampa la stringa "Hello, world". Non sto capendo il significato dell'istruzione org (direttiva?).

Come ho capito, org definisce dove viene caricato il programma in esecuzione. Questo è necessario quando si utilizza qualsiasi tipo di etichette o indirizzi relativi nel programma.

Supponiamo che io sono una stringa definita con un'etichetta come questo nel mio programma:

szHello db 'Hello, world!', 0 

E poi cerco di riferimento che etichettare come questo (solo frammenti rilevanti):

org 0x7c00 
xor ax, ax 
mov ds, 0 
... 
mov si, szHello 
lodsb 
... 
int 0x10 ; Print first character of szHello 

La mia domanda è, perché non è equivalente a questo? :

org 0 
mov ds, 0x7c00 
... 
mov si, szHello 
lodsb 
... 
int 0x10 

Quando si esegue il primo esempio, la stringa viene visualizzata correttamente. Il secondo esempio non funziona.

Anche i riferimenti alla documentazione pertinente sarebbero molto apprezzati, se il problema è un problema concettuale da parte mia.

risposta

8

0000: 7C00 non è equivalente a 7C00: 0000. La parte del segmento viene conteggiata in paragrafi, non in byte. Prova a modificare:

mov ax, 0x7c0 
mov ds, ax 
+0

Eccellente, funziona, grazie. Tuttavia, non sono sicuro di aver capito appieno. 'Org' consuma un indirizzo di segmento o un offset in un segmento? –

+1

È un offset nel segmento corrente. –

+0

'mov ds, 0x7c0' non è un'istruzione valida. Forse intendi qualcosa come "mov ax, 0x7c0'' mov ds, ax' –

13

org definisce dove il programma in questione prevede di essere caricato in memoria. Non dove viene effettivamente caricato, cioè controllato da chi esegue il caricamento, ma dove si aspetta di essere caricato.

+0

Interessante. Cosa succede al mio programma se è caricato da qualche altra parte? E poi, perché esiste l'org? –

+0

Se è caricato da qualche altra parte, gli offset calcolati dall'assemblatore (come l'indirizzo dell'etichetta szHello) saranno errati e ciò che accadrà dopo è l'ipotesi di chiunque. –

+1

Detto in un'altra forma: gli indirizzi assoluti saranno errati. – ninjalj