2011-11-15 20 views
10

estoy siguiendo este tutorial como una primera incursión en el desarrollo del gestor de arranque/OS para x86 usando NASM:x 86 NASM 'org' Directiva significa

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

Y yo estoy en la lección 4, que está haciendo mi bootloader imprime la cadena "Hello, world". No entiendo el significado de la instrucción org (¿directiva?).

Según tengo entendido, org define dónde se carga el programa que se está ejecutando en la memoria. Esto es necesario cuando se utiliza cualquier tipo de etiquetas o direcciones relativas en el programa.

Supongamos que tengo una cadena definida con una etiqueta como esta en mi programa:

szHello db 'Hello, world!', 0 

Y luego intenta hacer referencia a esa etiqueta como esta (sólo fragmentos relevantes):

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

Mi pregunta es, ¿por qué eso no es equivalente a esto? :

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

Cuando ejecuto el primer ejemplo, la secuencia aparece correctamente. El segundo ejemplo no funciona.

Los punteros a la documentación relevante también serían muy apreciados, si el problema es un problema conceptual de mi parte.

Respuesta

8

0000: 7C00 no es equivalente a 7C00: 0000. La parte del segmento se cuenta en párrafos, no en bytes. Tal vez puedas probar:

mov ax, 0x7c0 
mov ds, ax 
+0

Excelente, eso funciona, gracias. Sin embargo, no estoy seguro de entender completamente. ¿'Org' consume una dirección de segmento, o una compensación en un segmento? –

+1

Es un desplazamiento en el segmento actual. –

+0

'mov ds, 0x7c0' no es una instrucción válida. Tal vez te refieres a algo como 'mov ax, 0x7c0'' mov ds, ax' –

13

org define en el que el programa en cuestión espera ser cargado en la memoria. No donde realmente está cargado, eso es controlado por quien realiza la carga, sino donde espera que se cargue.

+0

Interesante. ¿Qué le sucede a mi programa si está cargado en otro lugar? Y luego, ¿por qué 'org' existe en absoluto? –

+0

Si está cargado en otro lugar, las compensaciones calculadas por el ensamblador (como la dirección de la etiqueta szHello) serán incorrectas y lo que ocurra a continuación es una incógnita. –

+1

Dicho de otra forma: las direcciones absolutas serán incorrectas. – ninjalj