Стековый сегмент в загрузчике MikeOS - PullRequest
9 голосов
/ 12 июля 2010

Я не понимаю этот фрагмент кода:

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 - здесь BIOS загружает наш код.Но что такое «4K»?Килобайт?Я не понял :)
  • добавить топор, 544 - Почему снова «8K»?И почему мы добавляем 544?Почему не 512?
  • mov sp, 4096 - Здесь мы устанавливаем указатель стека.

Зачем мы делаем все эти манипуляции, прежде чем установить указатель стека?

1 Ответ

9 голосов
/ 13 июля 2010

Я думаю, что комментарий в последней строке подводит итог:

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

Структура памяти выглядит следующим образом:

+-------------------+ <-- 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

Комментарий к абзацам немного тупой;Мне проще думать в байтах, где 16 байтов составляют один абзац.

Причина этих магических чисел:

  • Начало в сегменте 07C0, где BIOS загружает код
  • Пропустить последние 512 байт, чтобы учесть сам код (512 байт = 32 абзаца)
  • Пропустить 8 КБ, чтобы выделить место для дискового буфера (8 192 байт = 512 абзацев)
  • Поставьте SS в начале блока 4KB. 512 + 8192 = 8 704 байта = 544 абзаца
  • Поставьте SP в конце этого блока.Поместите его в конец, потому что стек должен увеличиваться в памяти.

Обратите внимание, что число 4096 = 4 КБ в коде выглядит как обычно, поскольку регистру SP требуется значение в байтах.Все остальные значения в параграфах, потому что они относятся к SS, который является регистром сегментов.

...