2010-07-12 8 views
9

No entiendo este pedazo de código:segmento de pila en el cargador de arranque MikeOS

mov ax, 07C0h ; Set up 4K of stack space above buffer 
add ax, 544  ; 8k buffer = 512 paragraphs + 32 paragraphs (loader) 
cli    ; Disable interrupts while changing stack 
mov ss, ax 
mov sp, 4096 
sti    ; Restore interrupts 
  • mov ax, 07C0h - aquí BIOS carga nuestro código . Pero, ¿qué es '4K'? Kilobytes? I no lo entendí :)
  • add ax, 544 - ¿Por qué '8K'? ¿Y por qué agregamos 544? ¿Por qué no 512?
  • mov sp, 4096 - Aquí establecemos el puntero de la pila.

¿Para qué hacemos todas estas manipulaciones antes de configurar el puntero de la pila?

+0

¿Tiene la fuente para el resto del gestor de arranque? –

+1

Sí. Está disponible aquí http://mikeos.berlios.de/#downloads o lo he compartido aquí http://snipt.org/Tmon –

+0

Ligera tangente: podría estar equivocado en esto, y no tengo el manual de Intel útil para verificar, pero creo que las instrucciones 'CLI' y' STI' son innecesarias aquí. IIRC, se garantiza que si un movimiento a 'SS' es seguido inmediatamente por un movimiento a 'SP', entonces no ocurrirán interrupciones entre las dos instrucciones de movimiento. – bcat

Respuesta

9

creo que el comentario sobre la última línea lo resume:

buffer:    ; Disk buffer begins (8k after this, stack starts) 

La distribución de la memoria es el siguiente:

+-------------------+ <-- 07C0:0000, where the BIOS loads the boot sector 
| 512 bytes of code | 
+-------------------+ 
| 8KB set aside for | 
| a disk buffer | 
+-------------------+ <-- SS:0000 
| 4KB of stack | 
+-------------------+ <-- SS:1000 = SS:SP 

El comentario sobre los párrafos es ligeramente obtuso; Me resulta más fácil pensar en bytes, donde 16 bytes forman un párrafo.

La razón de estos números mágicos:

  • inicio al segmento de 07C0, donde el BIOS carga el código
  • saltar más allá de 512 bytes, para tener en cuenta el propio código (512 bytes = 32 puntos)
  • Omitir más de 8 KB, reservar espacio para el búfer de disco (8192 bytes = 512 párrafos)
  • Poner SS al comienzo de un bloque de 4 KB. 512 + 8192 = 8,704 bytes = 544 párrafos
  • Ponga SP al final de ese bloque. Ponlo al final porque la pila necesita crecer hacia arriba en la memoria.

Tenga en cuenta que el número 4096 = 4 KB aparece normalmente en el código, porque el registro SP necesita un valor en bytes. Todos los otros valores están en párrafos porque se relacionan con SS, que es un registro de segmento.

+1

Gracias. Me has ayudado mucho :) –

+0

¿Podría preguntar, cómo sabe un programador que tiene que hacer todo esto? ¿Dónde está el manual para esto, ni siquiera sé qué manual debería ver? (Me refiero a dónde está el manual que dice que 07C0h es donde el BIOS carga el código) – gideon

+0

@gideon Este tipo de detalles se remonta a la PC original de IBM, por lo que habría sido documentado por IBM y reproducido por los fabricantes de clones de PC. Más tarde, en los años 80 y 90, tuvimos libros como [PC Intern] (http://www.amazon.com/PC-Intern-Encyclopedia-Programming-Developers/dp/1557553041/ref=sr_1_1?ie=UTF8&qid=1381938577&sr=8 -1 & keywords = pc + pasante). Y ahora este tipo de conocimiento oscuro circula en sitios como http://wiki.osdev.org y, por supuesto, Stack Overflow. –

Cuestiones relacionadas