实验1:引导程序
1.1实验目的
1、 对主引导记录进行理解。
2、 明白操作系统生成的过程。
3、 在U盘上实现一个可运行的引导程序。
1.2实验内容
1、用汇编语言编写一小段程序,如在屏幕上输出一个字符。(调用中断)
2、利用命令或winhex等工具将编译好的二进制程序写入U盘的主引导记录
3、开机,选择U盘启动,观察实验效果。
4、进一步地,丰富前述程序的功能,如增加键盘中断,可以对键盘上的动作进行响应(如敲入某字符X,屏幕能回显即可)。
5、再次写入引导扇区,观察实验效果
注:本文用虚拟机开启镜像代替U盘!
汇编语言 boot.asm文件
org 07c00h ; 告诉编译器程序加载到7c00处
xor ax, ax ; 清零ax
mov ds, ax ; 清零ds
mov es, ax ; 清零es
call PrintWelcome ; 调用显示字符串例程
;call printstr
call KeyboardEvent ; 调用显示字符串例程
jmp $ ; 无限循环
PrintWelcome:
mov ax, Message1
mov bp, ax ; ES:BP = 串地址
mov cx, 42 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
KeyboardEvent:
mov ah,00h ; 从键盘读字符,放到al里
int 16h
mov dl,al ; 把读的字符从al放到dl里
mov ah,0eh ; 显示dl里的字符
int 10h
mov ax, Message2
mov bp, ax ; ES:BP = 串地址
mov cx, 25 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 2 ; 列号
mov dh, 2 ; 行号
cmp al, 'a'
je display
jmp KeyboardEvent
display:
add dh, 1
int 10h ; 10h号中断
jmp KeyboardEvent
Message1: db "Hello World!",0ah,0dh,"press any key:",0ah,0dh
Message2: db "is the key you pressed.",0ah,0dh
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
go.sh文件
nasm boot.asm -o boot.bin
dd if=/dev/zero of=emptydisk.img bs=512 count=2880 #生成空白软盘镜像文件
dd if=boot.bin of=boot.img bs=512 count=1 #用 bin file 生成对应的镜像文件
dd if=emptydisk.img of=boot.img skip=1 seek=1 bs=512 count=2879 #在 bin 生成的镜像文件后补上空白,成为合适大小的软盘镜像
rm -f boot.bin
rm -f emptydisk.img
两个文件放一起。boot.asm是代码,可以自己修改,改好直接运行go.sh,会生成一个镜像是boot.img
然后下载虚拟机,用虚拟机打开boot.img
过程如下
启动,Over
结果: