練習(xí)2
切換至32x保護(hù)模式
A 設(shè)計內(nèi)存分配

a.png
B 實現(xiàn)
SECTION MBR vstart=0x7c00 align=16
mov ax,0
mov ss,ax
mov sp,0
;初始化內(nèi)存0x20000
;------------------------- EQU -------------------------
EQU_DISK_IO_0: equ 0x1f2
EQU_DISK_IO_1: equ 0x1f0
EQU_DISK_COMMOND_READ: equ 0X20
EQU_DISK_LBA: equ 0xe0
EQU_DISK_RM_GUIDE_ALLOC:equ 0x2000
;------------------------- MBR -------------------------
MBR_START:
MBR_READ_RM_GUIDE_LENGTH:
mov ax,TEST_END
MBR_LOAD_RM_GUIDE:
push ax
push 0
push EQU_DISK_RM_GUIDE_ALLOC
push 0
push 0
push 0
push 1
push 1
call MBR_FUNCTION_DISK_LOAD
MBR_PROTECT_CHANGE:
mov ax,[cs:gdt_base+0x7c00]
mov dx,[cs:gdt_base+0x7c00+0x02]
mov bx,16
div bx
mov ds,ax
mov bx,dx
mov dword [bx+0x00],0x00
mov dword [bx+0x04],0x00
mov dword [bx+0x08],0x000001ff
mov dword [bx+0x0c],0x00409802
mov dword [bx+0x10],0x8000ffff
mov dword [bx+0x14],0x0040920b
mov word [cs: gdt_size+0x7c00],23
lgdt [cs: gdt_size+0x7c00]
in al,0x92
or al,0000_0010B
out 0x92,al
cli
mov eax,cr0
or eax,1
mov cr0,eax
jmp dword 0x0008:0
MBR_LOAD_REMLOC:
jmp far [0]
MBR_FUNCTION_DISK_LOAD:
;讀取的扇區(qū)數(shù)
;起始邏輯扇區(qū)
;起始邏輯扇區(qū)
;起始邏輯扇區(qū)
;起始邏輯扇區(qū)
;目標(biāo)內(nèi)存地址
;目標(biāo)內(nèi)存偏移
;讀取字節(jié)數(shù)量
pop si
pop ax
mov dx,EQU_DISK_IO_0
out dx,al
pop ax
inc dx
out dx,al
pop ax
inc dx
out dx,al
pop ax
inc dx
out dx,al
pop ax
inc dx
add al,EQU_DISK_LBA
out dx,al
inc dx
mov al,EQU_DISK_COMMOND_READ
out dx,al
pop ds
pop bx
.MBR_WAIT:
in al,dx
and al,0x88
cmp al,0x08
jnz .MBR_WAIT
pop cx
mov dx,EQU_DISK_IO_1
.MBR_READ:
in ax,dx
mov [bx],ax
add bx,2
loop .MBR_READ
push si
ret
MBR_FINISH:
hlt
gdt_size dw 0
gdt_base dd 0x00010000
resb 446-($-$$)
MBR_DPT:
resb 64-($-MBR_DPT)
MBR_FINISH_MAGIC_CODE:
db 0x55,0xaa
SECTION PROTECT align=16
TEST_START:
[bits 32]
mov cx,00000000000_10_000B
mov ds,cx
;以下在屏幕上顯示"Protect mode 32."
mov byte [0x00],'P'
mov byte [0x02],'r'
mov byte [0x04],'o'
mov byte [0x06],'t'
mov byte [0x08],'e'
mov byte [0x0a],'c'
mov byte [0x0c],'t'
mov byte [0x0e],' '
mov byte [0x10],'m'
mov byte [0x12],'o'
mov byte [0x14],'d'
mov byte [0x16],'e'
mov byte [0x18],' '
mov byte [0x1a],'3'
mov byte [0x1c],'2'
hlt
TEST_END:
PS:總是忘了把硬盤上的數(shù)據(jù)移到內(nèi)存段。一定是MBR寫多了