我不明白这段代码:
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 - 在这里我们设置堆栈指针。
在设置堆栈指针之前,我们为什么要做所有这些操作呢?
我认为最后一行的评论总结了这一点:
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 段)
- 跳过 8KB,为磁盘缓冲区留出空间(8,192 字节 = 512 段)
- 将 SS 放在 4KB 块的开头。512+8192 = 8,704 字节 = 544 段
- 将 SP 放在该块的末尾。放在最后是因为栈需要在内存中向上增长。
请注意,数字 4096 = 4KB 在代码中正常显示,因为 SP 寄存器需要一个以字节为单位的值。所有其他值都在段落中,因为它们与 SS(段寄存器)相关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)