Я не понимаю эту часть кода:
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
Зачем мы делаем все эти манипуляции, прежде чем мы установим указатель вершины стека?
Думаю, комментарий к последней строке резюмирует это:
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 байтов составляют один абзац.
Причина появления этих магических чисел:
Обратите внимание, что число 4096 = 4 КБ отображается в коде как обычно, потому что регистру SP требуется значение в байтах. Все остальные значения указаны в параграфах, потому что они относятся к SS, который является сегментным регистром.