操作系统:在U盘上实现一个可运行的引导程序

实验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

结果:
在这里插入图片描述

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值