2011-02-04 13 views
7

Actualmente estoy en el medio de aprender a ensamblar x86 por diversión, me encanta la programación de microcontroladores, así que estoy familiarizado con el ensamblaje.Ensamblaje: utilizando el Registro de segmento de datos (DS)

Actualmente he estado buscando respuestas altas y bajas para esta pregunta, pero parece que no puedo encontrarla ... el registro DS, sé que se supone que apunta a los datos globales de mi programa, pero No sé cómo funciona exactamente. Estoy usando NASM, y en la mayoría de los programas simples que veo lo siguiente:

 
[org 0x7C00] 
[bits 16] 

main: 
mov ax, 0x0000 
mov ds, ax 
mov al, [msg] 
mov ah, 0x0E 
mov bx, 0x0007 
int 0x10  
jmp $ 

msg db 'X' 

times 510-($-$$) db 0 
dw 0xAA55 

y que funciona perfectamente (incluso si omito el código en negrita), pero ¿cómo? ¿La CPU carga automágicamente las variables globales comenzando en 0x0000? o hay algo intrínseco aquí que me estoy perdiendo?

+0

Posible duplicado de: http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly, http://stackoverflow.com/questions/4119504/real-mode-memory-addressing -explicacion/33581044 # 33581044 –

Respuesta

12

Cuando la computadora está en modo real (el modo en que está la CPU cuando el BIOS ejecuta el gestor de arranque), el método que utiliza la CPU para calcular la dirección es muy simple: Multiplica el valor de registro de segmento por 16 a la izquierda), luego agregue el desplazamiento.

Por ejemplo, en una instrucción como "mov ax, [0x1234]" la CPU usaría "DS * 0x10 + 0x1234" como la dirección efectiva (el primer término se resuelve en cero en su caso). "mov ax, [BP + 0x32]", entonces la CPU usará "SS * 0x10 + BP + 0x32". Tenga en cuenta que ahora la CPU utilizó un registro de segmento diferente (el segmento de pila), y eso se debe a que cuando se usa el registro BP, la CPU asume que no quiere acceder a la pila de forma predeterminada (pero puede anularlo usando [DS : BP + 0x32]).

Más o menos lo que he explicado y más se pueden encontrar en http://wiki.osdev.org/Real_Mode y http://www.internals.com/articles/protmode/realmode.htm y en muchos lugares más.

Por cierto, "msg" debe ubicarse más o menos en la dirección 0x7C11.

+0

Gracias! Esto respondió mi pregunta perfectamente^_ ^. –

Cuestiones relacionadas