- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
- bits 16
- org 0x7c00
- Start:
- xor ax,ax
- mov ds,ax
- cli
- lgdt [GDTR]
- mov eax,cr0
- or al,1
- mov cr0,eax
- jmp dword 0x08:PEStart
- GDTR:
- .limit:
- dw GDT.End-GDT-1
- .base:
- dd GDT
- GDT:
- dw 0,0,0,0
- dw 0xffff
- dw 0
- dw 0x9a00
- dw 0x00cf
- dw 0xffff
- dw 0
- dw 0x9200
- dw 0x00cf
- .End:
- PEStart:
- bits 32
- mov ax,0x10
- mov es,ax
- mov ss,ax
- mov ds,ax
- mov fs,ax
- mov gs,ax
- mov esp, 0xffff
- .text:
- mov dword[0xb8000],'P'|('r'<<16)|0x07000700
- mov dword[0xb8004],'o'|('t'<<16)|0x07000700
- mov dword[0xb8008],'e'|('c'<<16)|0x07000700
- mov dword[0xb800c],'t'|('e'<<16)|0x07000700
- mov dword[0xb8010],'d'|(' '<<16)|0x07000700
- mov dword[0xb8014],'m'|('o'<<16)|0x07000700
- mov dword[0xb8018],'d'|('e'<<16)|0x07000700
- jmp .text
- times 510-($-$$) db 0
- dw 0xAA55
复制代码 编译为平坦格式flp后缀,让vmware把它当作一个启动软盘加载即可运行。
没有出问题的话,它应该会显示一句“Protected mode”。
细节上要注意的点:
1、切模式前务必关中断。用cli即可。如果只是想进保护模式玩玩的话,无需设置IDT和TS。
2、nasm编译器,我用的版本是2.13.01。经过我的测试2.11版有BUG,会导致它无视你的bits 32语句。
3、修改cr0的数值后必须立即跳转。
4、可以不用在跳转前修改段选择子。
5、开头的那几句:
xor ax,ax
mov ds,ax
经测试,必须要有。因为引导进来的时候ds并没有指向你的代码所在的段上。不设置这两句的话,lgdt指令并不能正确找到你的gdt表。
|
|