这里紧跟上一篇谈到的0x7C00开始执行,当然此时是在实模式下面,执行最初先禁止中断,因为现在堆栈都没有就算有中断也不能执行,所以第一步禁止中断,一直到设置好堆栈才打开中断。这一部分代码很简单,利用ax将段寄存器全部清零,然后调用切换到保护模式下面去,但是由于CS一直都在使用当中,所以就不需要初始化CS。不过要注意的是实际上进入switch_to_prot的时候,并没有进入保护模式,而是在 返回的时候才是执行保护模式下面的32位代码。
1. .code16
2. EXTERN(_RealEntryPoint)
3. cli
4. xor ax, ax
5. mov ds, ax
6. mov es, ax
7. mov fs, ax
8. mov gs, ax
9. mov ss, ax
10. mov sp, word ptr ds:stack16
11. sti
12. call switch_to_prot
13. .code32
14. xor eax, eax
15. mov dword ptr [_FrldrBootPartition], eax
16. mov byte ptr [_FrldrBootDrive], dl
17. mov byte ptr [_FrldrBootPartition], dh
18. call _EnableA20
19. xor eax, eax
20. mov edi, offset __bss_start__
21. mov ecx, offset __bss_end__ + 3
22. sub ecx, edi
23.