注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

14 章 复习 通用内核加载程序--MBR主引导代码  

2013-04-07 16:43:42|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
把13章的内核加载程序复习一遍.

core_start_sector equ 0x1
core_load_address equ 0x40000

xor ax,ax
mov ss,ax
mov sp,0x7c00
mov ax,[cs:pgdt+0x7c00+0x2]
mov dx,[cs:pgdt+0x7c00+0x4]
mov bx,16
div bx
mov ds,ax
mov bx,dx
mov dword [bx+0x00],0
mov dword [bx+0x04],0
;#4GB内存段
mov dword [bx+0x08],0x0000ffff 
mov dword [bx+0x0c],0x00cf9200
;#MBR
mov dword [bx+0x10],0x7c0001ff 
mov dword [bx+0x14],0x00409800
;#堆栈 内核使用该栈
mov dword [bx+0x18],0x7c00fffe 
mov dword [bx+0x1c],0x00cf9600
;#显示缓冲区
mov dword [bx+0x20],0x80007fff
mov dword [bx+0x24],0x0040920b

mov word [cs:pgdt+0x7c00],39
lgdt [cs:pgdt+0x7c00]

in al,0x92
or al,2
out 0x92,al

cli 

mov eax,cr0
or eax,1
mov cr0,eax

jmp 0x10:flush

[bits 32]
flush:
mov eax,0x18
mov ss,eax
mov esp,0
mov eax,0x8
mov ds,eax

mov eax,core_start_sector
mov edi,core_load_address
mov ebx,edi
call readharddisk
mov eax,[edi]
xor edx,edx
mov ecx,512
div ecx
or edx,edx
jnz @1
dec eax
@1:
or eax,eax
jz setup
mov ecx,eax
mov eax,core_start_sector
load:
inc eax
call readharddisk
loop load

setup:
mov esi,[pgdt+0x7c00+0x2]
;公共例程段
mov eax,[edi+0x4]
mov ebx,[edi+0x8]
sub ebx,eax
dec ebx
add eax,edi
mov ecx,0x00409800
call make_seg_descript
mov [esi+0x28],eax
mov [esi+0x2c],edx

;内核数据段
mov eax,[edi+0x8]
mov ebx,[edi+0xc]
sub ebx,eax
dec ebx
add eax,edi
mov ecx,0x409200 
call make_seg_descript
mov [esi+0x30],eax
mov [esi+0x34],edx
;内核代码段
mov eax,[edi+0xc]
mov ebx,[edi]
sub ebx,eax
dec ebx
add eax,edi
mov ecx,0x409800
call make_seg_descript
mov [esi+0x38],eax
mov [esi+0x3c],edx

mov word [pgdt+0x7c00],63
lgdt [pgdt+0x7c00]

jmp far [edi+0x10]

;入口参数: eax=段基地址,ebx=界限 ecx=属性,返回EDX:EAX段描述符
make_seg_descript:
push ebx
mov edx,eax
shl eax,16
or ax,bx
xor dx,dx
rol edx,8
bswap edx
and ebx,0xf0000
or edx,ebx
or edx,ecx
pop ebx
ret

;入口参数: eax=起始扇区号 DS:EBX=加载地址 返回ebx=ebx+512
readharddisk:
push eax
push ecx
push edx
push eax
mov dx,0x1f2
mov al,1
out dx,al
inc dx ;0x1f3
pop eax
out dx,al
shr eax,8
inc dx ;0x1f4
out dx,al
inc dx ;0x1f5
shr eax,8
inc dx ;0x1f6
out dx,al
shr eax,8
or al,0xe0
out dx,al
inc dx ;0x1f7
mov al,0x20
out dx,al
.waits:
in al,dx
and al,0x88
cmp al,0x8
jnz .waits
mov dx,0x1f0
mov ecx,256
.read:
in ax,dx
mov [ebx],ax
add ebx,2
loop .read
pop edx
pop ecx
pop eax
ret


message: db 0xd,0xa,' hello,world!',0

pgdt dw 0
dd 0x7e00



times 510-($-$$) db 0
db 0x55,0xaa

  评论这张
 
阅读(32)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017