I think the comment on the last line sums it up:
buffer: ; Disk buffer begins (8k after this, stack starts)
The memory layout looks like this:
+-------------------+ <-- 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
The comment about paragraphs is slightly obtuse; I find it easier to think in bytes, where 16 bytes makes one paragraph.
The reason for these magic numbers:
- Start at segment 07C0, where the BIOS loads the code
- Skip past 512 bytes, to account for the code itself (512 bytes = 32 paragraphs)
- Skip past 8KB, to set aside space for the disk buffer (8,192 bytes = 512 paragraphs)
- Put SS at the start of a 4KB block. 512+8192 = 8,704 bytes = 544 paragraphs
- Put SP at the end of that block. Put it at the end because the stack needs to grow upwards in memory.
Note that the number 4096 = 4KB appears as normal in the code, because the SP register needs a value in bytes. All the other values are in paragraphs because they relate to SS, which is a segment register.
CLI
andSTI
instructions are unnecessary here. IIRC, it's guaranteed that if a move toSS
is immediately followed by a move toSP
, then no interrupts shall occur between the two move instructions. – bcatMOV/ADD
sequence is unnecessary too - it could just be oneMOV
instruction – Tim Robinson