- 直接使用显卡显示内容
直接使用显卡显示内容
- nasm -o mbr.bin mbr.S
[haifei@localhost boot]$ nasm -o mbr.bin mbr.S
[haifei@localhost boot]$ ll
total 8
-rw-rw-r--. 1 haifei haifei 512 May 14 19:39 mbr.bin
-rw-rw-r--. 1 haifei haifei 1054 May 14 19:38 mbr.S
- 生成hd60M.img
[haifei@localhost bochs-2.6.2]$ bximage -hd -mode="flat" -size=60 -q hd60M.img
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================
I will create a 'flat' hard disk image with
cyl=121
heads=16
sectors per track=63
total sectors=121968
total size=59.55 megabytes
The disk image 'hd60M.img' already exists. Are you sure you want to replace it?
Please type yes or no. [no] yes
Writing: [] Done.
I wrote 62447616 bytes to hd60M.img.
The following line should appear in your bochsrc:
ata0-master: type=disk, path="hd60M.img", mode=flat, cylinders=121, heads=16, spt=63
- 将mbr.bin目录追加到hd60M.img
[haifei@localhost bochs-2.6.2]$ dd if=/home/haifei/bochs2.6.2/bochs-2.6.2/systemCode/c3/a/boot/mbr.bin of=/home/haifei/bochs2.6.2/bochs-2.6.2/hd60M.img bs=512 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000139165 s, 3.7 MB/s
3.启动bochs
bochs -f .bochsrc
SECTION MBR vstart=0x7c00
mov ax, cs ;使用cs的值去初始化其他寄存器。由于BIOS是通过jmp 0: 0x7c00调转到MBR上的,cs此时为0
mov dx, ax
mov es, ax
mov ss, ax
mov fs, ax
mov sp, 0x7c00 ;初始化栈指针
mov ax, 0xb800 ;显存文本模式,栈指针
mov gs, ax ;将段基址写入到gs寄存器中
;清屏
;利用0x06功能号,上卷全部行,则可清屏
;AH 功能号=0x06
;AL 上卷的行数(如果为0,则为全部)
;BH 上卷的行属性
;(CL,CH)=窗口左上角的(X,Y)位置
;(DL,DH)=窗口右下角的(X,Y)位置
mov ax, 0600h
mov bx, 0700h
mov cx, 0
mov dx, 184fh
int 10h ;系统中断
mov byte [gs:0x00], '1'
mov byte [gs:0x01], 0xA4 ;A表示绿色背景闪烁,4表示前景色为红色
mov byte [gs:0x02], ' '
mov byte [gs:0x03], 0xA4
mov byte [gs:0x04], 'M'
mov byte [gs:0x05], 0xA4
mov byte [gs:0x06], 'B'
mov byte [gs:0x07], 0xA4
mov byte [gs:0x08], 'R'
mov byte [gs:0x09], 0xA4
jmp $ ;通过死循环使程序悬停在这里
times 510-($-$$) db 0
db 0x55,0xaa
由硬盘读取数据
[haifei@localhost boot]$ cat include/boot.inc
;------------loader与kernel-----------------
LOADER_BASE_ADDR equ 0x900
LOADER_START_SECTOR equ 0x2
编译
nasm -I include/ -o loader.bin loader.S
;主引导程序
;---------------------------------------
%include "boot.inc"
SECTION MBR vstart=0x7c00
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov sp,0x7c00
mov ax,0xb800
mov gs,ax
;清屏
;利用0x06号功能,上卷全部行,则可清屏
;--------------------------------------
;INT 0x10 功能号:0x06 功能描述:清屏
;--------------------------------------
mov ax,0x600
mov bx,0x700
mov cx,0
mov dx,0x184f
int 0x10
;A表示绿色背景闪烁,4表示前景色为红色
mov byte [gs:0x00],'1'
mov byte [gs:0x01],0xA4
mov byte [gs:0x02],''
mov byte [gs:0x03],0xA4
mov byte [gs:0x04],'M'
mov byte [gs:0x05],0xA4
mov byte [gs:0x06],'B'
mov byte [gs:0x07],0xA4
mov byte [gs:0x08],'R'
mov byte [gs:0x09],0xA4
mov eax,LOADER_START_SECTOR ;起始扇区地址
mov bx,LOADER_BASE_ADDR ;写入的地址
mov cx,1 ;待读入的扇区数
call rd_disk_m_16 ;以下读取程序的起始部分(一个扇区)
jmp LOADER_BASE_ADDR
;----------------------------------------------
;功能:读取硬盘n个扇区
;----------------------------------------------
rd_disk_m_16:
;eax=LBA扇区号
;bx=将数据写入的内存地址
;cx=待读入的扇区数
mov esi,eax ;备份eax
mov di,cx ;备份cx
;读写硬盘
;第一步:设置读取的扇区数
mov dx,0x1f2
mov al,cl
out dx,al ;读取的扇区数
mov eax,esi ;恢复ax
;第二步:将LBA地址存入0x1f3 ~ 0x1f6
;LBA地址7~0位写入0x1f3
mov dx,0x1f3
out dx,al
;LBA地址15~8位写入端口0x1f4
mov cl,8
shr eax,cl
mov dx,0x1f4
out dx,al
shr eax,cl
mov dx,0x1f5
out dx,al
shr eax,cl
and al,0x0f
out dx,al
shr eax,cl
mov dx,0x1f5
out dx,al
shr eax,cl
and al,0x0f ;lba第24-27位
or al,0xe0 ;设置7-4位为1110,表示lba模式
mov dx,0x1f6
out dx,al
;第三步:向0x1f7端口写入读命令,0x20
mov dx,0x1f7
mov al,0x20
out dx,al
;第四步:检测硬盘状态
not_ready:
nop
in al,dx
and al,0x88
cmp al,0x08
jnz not_ready
;第五步:从0x1f0端口读数据
mov ax,di
mov dx,256
mul dx
mov cx,ax
mov dx,0x1f0
go_on_read:
in ax,dx
mov [bx],ax
add bx,2
loop go_on_read
ret
times 510-($-$$) db 0
db 0x55,0xaa
网友评论