[Intel汇编-NASM]主引导扇区程序介绍

本文介绍了主引导扇区在计算机启动过程中的作用,包括实模式下的内存逻辑地址空间、开机流程,以及MBR如何加载操作系统。重点讲解了MBR的定位、验证和执行过程,同时提到了局部和全局标号在汇编编程中的应用,为后续操作系统引导和调试奠定基础。
摘要由CSDN通过智能技术生成

1. 主引导扇区的作用以及开机之后的大致流程:

    1) 为了学习实模式下的编程而不受操作系统的影响,因为在正常的开机后,经过主引导扇区的对操作系统的加载就会把计算机的控制权交给操作系统从而进入保护模式,因此就只有运行主引导扇区程序时系统处于实模式状态;

    2) 内存逻辑地址空间:

        i. 实模式下CPU有20根地址线,能访问的地址空间有1MB,但是这1MB并不全部都指向DRAM;

        ii. 在体系结构中CPU将这1MB空间映射到了多个存储设备上,其中:

        iii. ROM占据顶部64KB空间,F0000~FFFFF;

        iv. DRAM占据底部640KB的1MB中最大的空间,00000~9FFFF;

        v. 中间空出来320KB用于分配给外围设备的存储空间,其中最重要的就是字符界面的显示器,这是一种古老的显示模式,80(个字符) × 25(行)为一屏,一屏总共能满满显示2000个字符,由于每个字符包括其ASCII码和颜色等属性,因此一个字符占两个字节,因此一屏占4000个字节,而留个其的地址空间时B8000~BFFFF这32768个字节(即刚好一个段64KB),总共可以容纳8屏多一点点儿,而在屏幕上显示字符的过程仅仅就是向显存中存放字符的过程那么简单;

    3) 开机加电后系统的运作流程:

        i. 卡机加电后cs:ip自动指向0xFFFF0的BIOS固件处;

        ii. 该处只有一条指令:jmp far 0xF000:0x0000,然后跳转到了BIOS固件的起始位置,运行BIOS的程序;

        iii. 在BIOS程序中会先在0x00000处加载BIOS自己的中断向量表,然后再执行一些硬件初始化和自检程序;

        iv. 完成自检和初始化后调用BIOS的int19中断例程将控制权交给操作系统(实质上该例程是读取磁盘0号逻辑扇区的MBR主引导扇区程序,而传统上MBR是属于操作系统的,虽然该程序仍然运行于实模式);

    4) MBR:

        i. 即主引导扇区程序,位于逻辑0号扇区内,作用是加载操作系统代码,使程序从实模式变换到保护模式,真正将系统的实权交给操作系统,即扮演一个接力手的角色;

        ii. int19BIOS例程会从磁盘的0面0道1扇区(也是逻辑0号扇区)的512B内容加载到0x0000:0x7C00处;

        iii. BIOS判断该扇区是MBR的标准就是检测512字节的最后两个字节是否是0x55和0xAA,这是规范!如果检测符合规范,则执行跳转指令jmp far 0x0000:0x7C00转到主引导程序处执行操作系统引导工作,否则就会开机失败转去执行错误处理中断例程报告本次开机失败!

    5) 在这里我们不介绍如何引导操作系统,只介绍一个简单的MBR程序,让其在屏幕上显示一定的内容,并学会如何使用BOCHS单步调试,这也是调试操作系统内核的基础;

	; 此程序用于显示标号target的汇编地址的十进制形式
	; 注意,此时跳到了0x0000:0x7C00处
	; 因此cs=0x0000而ip=0x7C00

			jmp		start

stack		times 20 db 0						; 定义一个栈,程序中需要使用
len_stack	equ $ - stack	

VIDEO_SEG_BEGIN			equ		0xB800			; 显存起始段地址
THIS_SEG				equ		0x7C00			; 整个程序自成一段,起始偏移地址为0x7C00但起始汇编地址是0x0000

str_info			db		'Label offset: '	; 要显示的信息
len_str_info		equ		$ - str_info		; 上面字符串的长度

target	db	0

    start:
			; es指向显存,ds指向str_info
			mov		ax, VIDEO_SEG_BEGIN
			mov		es, ax
			mov		ax, cs						; 此时cs=0x0000
			mov		ds, ax
			
			; 显示字符串"Label offet: "
			mov		ah, 0007H					; 设置字的颜色属性,ASCII码存放在al中,颜色属性存放在ah中	
			mov		bx, 0
			mov		bp, 0
			mov		cx, len_str_info
.lp1:		mov		al, [THIS_SEG + str_info + bx]
			mov		[es:bp], ax
			inc		bx
			add		bp, 2
			loop	.lp1

			; 初始化栈段
			mov		ax, cs
			mov		ss, ax
			mov		sp, THIS_SEG + stack + len_stack

			; 将target分解成5位十进制数的ASCII码并倒序入栈
			mov		ax, target
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值