Bootloader_start:
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 ;set data segment to where we are loaded
mov ds, ax
Сначала очевидная оптимизация, которая позволила бы избежать правильной критики со стороны Питера о неиспользовании добавления во время сборки:
Bootloader_start:
mov ax, 07C0h ;set up 4k of stack space above buffer
MOV DS, AX
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
Тогда почему 544?
Автор хочет иметь 8192-байтовый буфер плюс 4096-байтовый стек прямо над загрузчиком, который находится в памяти по линейному адресу 7C00h.
Делайте математику, зная, что линейный адрес7C00h - это абзац 07C0h:
Paragraph
---------
07C0h Bootloader 512 bytes == 32 paragraphs (20h)
07C0h + 0020h = 07E0h Buffer 8192 bytes == 512 paragraphs (200h)
07E0h + 0200h = 09E0h Stack 4096 bytes
---
544
Дно стека находится в абзаце 09E0h
, который равен 07C0h + (32 + 512)
или 07C0h + 544
.
Затем указатель стека SP
устанавливается со смещением 4096, поэтомуу нас полный SS:SP
.