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

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

9
задан mınxomaτ 13 July 2015 в 20:14
поделиться

1 ответ

Думаю, комментарий к последней строке резюмирует это:

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 в начало блока 4 КБ. 512 + 8192 = 8704 байта = 544 абзаца
  • Поместите SP в конец этого блока. Поместите его в конец, потому что стек должен расти вверх в памяти.

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

9
ответ дан 4 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: