第2行为将BootMessage复制给AX。
BP为指针寄存器,第3行将指针寄存器指向字符串起始地址。指针寄存器不能被直接操作,所以依靠AX寄存器进行值传递。
CX为计数器寄存器,11为“Helloworld!”字符串长度。
mov ax,01301h ;AH = 13,AL = 01h
该行是本函数的核心,是向屏幕输出字符的关键。
BIOS通过软件中断接收执行功能的请求。用nnh调用特定类型的中断服务函数。
例如10h用于显示服务 - 由BIOS或操作系统设定以供软件调用:
AH=00h 设定显示模式;
AH=01h 设定游标形态;
AH=02h 设置游标位置;
AH=03h 获取光标位置与形态;
AH=04h 获取光标位置;
AH=05h 设置显示页;
AH=06h 清除或滚动栏画面(上);
AH=07h 清除或滚动栏画面(下);
AH=08h 读取游标处字符与属性;
AH=09h 更改游标处字符与属性;
AH=0Ah 更改游标处字符;
AH=0Bh 设定边界颜色;
AH=0Eh 在TTY模式下写字符;
AH=0Fh 获取当前显示模式;
AH=13h 写字符串。
AL寄存器一共有8位,但是只使用低2位,高6位并不使用:
如果AL=0,表示目标字符串仅仅包含字符,属性在BL中包含,不移动光标。
如果AL=1,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标。
如果AL=2,表示目标字符串包含字符和属性,不移动光标。
如果AL=3,表示目标字符串包含字符和属性,移动光标。
mov bx,000ah ;黑底绿字
BX寄存器可分为高八位和低八位。
BH为页号,BL主要是用来定义一些颜色属性格式:
若 BIT7 = 1 ,背景闪烁。
若 BIT3 = 1 ,前景色高亮显示。
BIT4~BIT6 表示背景色。
BIT0~BIT2 表示前景色。
BH=00,BL=0Ah 即页号为0,不闪烁,背景色为黑色,前景色高亮显示,前景色为绿色
RET是return缩写,标示该函数调用结束并返回。
times 510 - ($-$$) db 0 ;生成一串512字节二进制代码
dw 0xaa55 ;结束标志
这两行是编写引导扇区的规范。
理解主引导扇区前需要先阐述什么是扇区。在现代冯诺依曼结构计算机中,存储器一般由机械硬盘与内存担任。
机械硬盘内部由若干盘片、可移动读写头、电机、数据传输接口以及一个控制电路组合而成。
磁盘盘片磁道上覆盖着导磁物质,读写头是一枚电磁铁悬空在盘片上方距离0.1μm~0.5μm处,通过变化的电流产生变化的磁场改变磁道上面的导磁物质极性记录数据,通过磁生电读取盘片数据。
一个盘片有两个磁头,正面盘片磁头编号0,反面为1,若有多个盘片磁头编号便会继续累加。磁道是是盘片内同心圆,在盘片正反两面的磁道构成一个柱面,从0开始编号,最边缘为0,编号往内逐步累加。每个磁道以512字节划分为若干扇区,编号由1开始。
硬件厂商约定MBR分区位于0面0道1扇区,占512字节储存主引导程序。计算机上电后BIOS会从主硬盘0面0道1扇区寻找并执行MBR程序,最终通过MBR拉起操作系统。
第1行中表示当前位置,$表示程序起始位置。一个扇区512字节,该表达式的意义就是将这个扇区除了写有代码的区域外全部填写0。并留下2个字节位置。
标准的MBR结构如下图,这也就解释了第2行代码的0xaa55了,它是MBR分区的结束标志!
二、Demo机器码解析
如无意外,经过编译后我们将得到一个.bin文件,如果是Windows下使用Vscode作为编译环境,在编辑器中安装Hex Editor扩展就能正常显示。而Linux使用Vim/Vi就能打开。
作为该项目参考书作者李忠老师也开发了一个小工具,如有必要可以在http://www.lizhongc.com/index.php/91.html下载使用。
现在我的电脑是云主机,限于现实环境将使用Vscode进行讲解。
-
计算机
+关注
关注
19文章
7428浏览量
87727 -
汇编
+关注
关注
2文章
214浏览量
25904 -
虚拟机
+关注
关注
1文章
908浏览量
28107
发布评论请先 登录
相关推荐
评论