1.汇编语言。分别汇编器和链接as86和ld86。码如下面:
.globl begtext,begdata,begbss,endtext,enddata,endbss .text begtext: .data begdata: .bss begbss: .text BOOTSEG=0x7c0 entry start start: jmpi go,BOOTSEG go: mov ax,cs mov ds,ax mov es,ax mov ax,#0x0600 mov cx,#0x0000 mov dx,#0xFFFF int 0x10 mov cx,#20 mov dx,#0x0000 mov bx,#0x000c mov bp,#msg1 mov ax,#0x1301 int 0x10 loop0:jmp loop0 msg1: .ascii "Loading system..." .byte 13,10 .org 510 .word 0xAA55 .text endtext: .data enddata: .bss endbss:
BOOTSEG=0x7c00
entry start
start:
jmpi go,BOOTSEG
go:
entry start告诉编译器程序入口是start,我们这段是引导代码。引导代码在引导盘的指定位置处,BIOS会读取引导盘的第一个扇区到内存0x7c00:0x00处。
注意:程序执行在实模式以下。寻址方式段*16+偏移,要想在0x7c00初開始执行,要设BOOTSEG=0x7c0,而不是0x7c00。
jmpi go,BOOTSEG是跳转到0x7c00:go处运行。前面我们说到BIOS会读取引导扇区到内存的0x7c00处。而jmpi 这条语句使得引导程序从0x7c00開始运行,也就是说。開始运行我们当前的引导区程序。
mov ax,#0x0600
mov cx,#0x0000
mov dx,#0xFFFF
int 0x10
这段代码调用BIOS的0x10中断,功能是清屏。
mov cx,#20
mov dx,#0x0000
mov bx,#0x000c
mov bp,#msg1
mov ax,#0x1301
int 0x10
上面代码调用BIOS的0x10中断,显示字符串msg1
.org 510
.word 0xAA55
启动扇区标志
2.编译调试boot.s程序。
前边说过使用as86汇编器和ld86链接器,使用bochs模拟器,bochs支持虚拟的软盘和硬盘。由于软盘简单一些,所以我们把程序编译后放到软盘上就可以启动了。
(1)编译boot.s
as86 -0 -a -o boot.o boot.s
(2)连接boot.o
ld86 -0 -s -o boot boot.o
(3)制作虚拟软盘
dd bs=32 if=boot of=boot.img skip=1
由于boot前32字节是文件头,所以要跳过不写。把后边全部的内容写进boot.img,至此boot.img就是做好的可启动虚拟软盘了
3.执行调试
创建bochsrc.txt。输入bochs命令就可以调试boot程序
4.linux的dd命令具体解释
dd [option]
语法:
if=输入文件[STDIN]
of=输出文件[STDOUT]
ibs=bytes 一次读取bytes字节
skip=blocks,跳过输入文件开头的ibs*blocks块
seek=bytes,跳过输出文件bytes*blocks块
obs=bytes,一次写入bytes字节
bs=bytes,等于同一时候设置obs和ibs
版权声明:本文博主原创文章,博客,未经同意不得转载。