解压nasm2
diskpart
create vdisk file=e:\dingst.vhd maximum=10 type=fixed
- org 07c00h
- mov ax,cs
- mov ds,ax
- mov es,ax
- call Disp
- jmp $
- Disp:
- mov ax,BootMsg
- mov bp,ax
- mov cx,16
- mov ax,01301h
- mov bx,000ch
- mov dl,0
- int 10h
- BootMsg:db "Hello, OS World!"
- times 510 - ($-$$) db 0
- dw 0xaa55
nasm E:\hello.asm -o E:\boot.bin
- E:\>dd if=boot.bin of=dingst.vhd bs=512 count=1
- rawwrite dd for windows version 0.5.
- Written by John Newbigin <jn@it.swin.edu.au>
- This program is covered by the GPL. See copying.txt for details
- 1+0 records in
- 1+0 records out
下一步选择注册刚才创建的虚拟磁盘。启动。成功看到了输出语句hello
=====================================================================
在操作系统运行之前,是BIOS在管理机器。
BIOS将操作系统拉入内存。
BIOS是固化在硬盘上的程序。
BIOS是谁加载的?
计算机被强制设置成开机后首先强制从物理地址FFFFF加载BIOS。
BIOS会自动去读取每个磁盘的MBR。MBR只有512个字节。
BIOS被加载到哪里?
BIOS会去扫描磁盘的0盘0道的第一个扇区的前512个字节,我们刚才编译后的文件就是通过dd.exe写到了hello.vhd这个虚拟磁盘的前512个字节中。BIOS强制规定了磁盘的0盘0道第1个扇区为可引导扇区,且最后必须以0xaa55结尾,否者这个磁盘不能被成功加载。如果可以被加载,就将这512个字节加载到BIOS专用物理地址的7C00及之后的地址。
=======================================================
实现加载时候在屏幕输出黑底白字的字母I
- mov ax,0xb800 ;指向文本模式的显存缓冲区
- mov es,ax
-
- mov byte [es:0x00],'I'
- mov byte [es:0x01],0x07
- jmp $
- times 510-($-$$) db 0
- db 0x55,0xaa
- E:\nasm2>nasm e:\disp.asm -o disp.bin
-
- E:\nasm2>cd ..
-
- E:\>dd.exe if=disp.bin of=dingst.vhd
- rawwrite dd for windows version 0.5.
- Written by John Newbigin <jn@it.swin.edu.au>
- This program is covered by the GPL. See copying.txt for details
- 1+0 records in
- 1+0 records out
-
- E:\>dd.exe if=disp.bin of=dingst.vhd bs=512 count=1
- rawwrite dd for windows version 0.5.
- Written by John Newbigin <jn@it.swin.edu.au>
- This program is covered by the GPL. See copying.txt for details
- 1+0 records in
- 1+0 records out
-
- E:\>
- mov ax,0xb800 ;指向文本模式的显存缓冲区
- mov es,ax
-
- mov byte [es:0x00],'I'
- mov byte [es:0x01],0x07
- mov byte [es:0x02],'K'
- mov byte [es:0x03],0x07
-
- times 510-($-$$) db 0
- dw 0xaa55
====================================================
16位的寄存器
寻址方式:
硬盘原理:
操作硬盘的步骤:
执行超过512字节的代码
BIOS去拉mbr,mbr中有命令叫将loader加载到 0x900位置
编写mbr.asm和loader.asm,分别编译,将mbr放入扇区0,将loader放入扇区2,
- ;引导程序。能够将第二个扇区里的内容加载进入内存
- ;mbr.asm放在扇区0, loader.asm
- ;将loader放入物理地址0x900处,这是BIOS允许使用的地址
-
- LOADER_BASE_ADDR equ 0x900 ;将loader放入物理地址0x900处,这是BIOS允许使用的地址
- LOADER_START_SECTOR equ 0x2 ;表示以LBA方式,我们的loader存在第二块扇区
-
- 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的功能,调用10号中断,清理屏幕。查手册可知
- ; AH = 0x06
- ; AL = 0表示全部都要清除
- ; BH = 上卷行的属性
- ;(CL,CH) 左上角x,y
- ;(DL,DH) 右下角
- mov ax, 0600h
- mov bx, 0700h
- mov cx,0
- mov dx,184fh
-
- int 10h
- ;屏幕打印输出方便我们查看,输出一句话表明我们在mbr中
- 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
-
- ;从MBR去加载我们存在第二扇区的loader,并将loader放入物理地址0x900处,这是BIOS允许使用的地址
- mov eax,LOADER_START_SECTOR ;从这个地址读
- mov bx,LOADER_BASE_ADDR ;要写入的地址
- mov cx,1 ;表明要读几个扇区
- call rd_disk
-
- jmp LOADER_BASE_ADDR ;跳到要存的实际物理地址,待会要讲loader写入这个地址
-
- rd_disk:
- mov esi,eax ;备份eax
- mov di,cx
-
- ;读写硬盘
- mov dx, 0x1f2
- mov al,cl
- out dx,al
- mov eax,esi
-
- ;将LBA的地址存入0x1f3 0x1f6
- mov dx,0x1f3
- out dx,al
-
- 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
- or al,0xe0
- mov dx,0x1f6
- out dx,al
-
- ;向0x1f7写入读命令
- mov dx,0x1f7
- mov al,0x20
- out dx,al
-
- ;检测硬盘状态
- .not_ready:
- nop
- in al,dx
- and al,0x88
- cmp al,0x08
- jnz .not_ready
-
- ;读取数据
- mov ax,di
- mov dx,256
- mul dx
- mov cx,ax
- mov dx,0x1f0
-
- .go_on:
- in ax,dx
- mov [bx],ax
- add bx,2
- loop .go_on
- ret
-
- times 510-($-$$) db 0
- dw 0xaa55
-
-
-
-
- LOADER_BASE_ADDR equ 0x900
- section loader vstart=LOADER_BASE_ADDR
-
- mov ax,0xb800 ;指向文本模式的显存缓冲区
- mov es,ax
-
- mov byte [es:0x00],'O'
- mov byte [es:0x01],0x07
- mov byte [es:0x02],'K'
- mov byte [es:0x03],0x07
-
- jmp $
- E:\nasm2>nasm e:\mbr.asm -o mbr.bin
- E:\>dd if e:\mbr.bin of=e:\dingst.vhd bs=512 count=1
-
- E:\nasm2>nasm e:\loader.asm -o e:\loader.bin
-
-
- E:\nasm2>cd ..
-
- E:\>dd if=loader.bin of=dingst.vhd bs=512 count=1 seek=2
- rawwrite dd for windows version 0.5.
- Written by John Newbigin <jn@it.swin.edu.au>
- This program is covered by the GPL. See copying.txt for details
- 0+1 records in
- 0+1 records out
-
- E:\>