源程序来源
加载程序功能
加载程序 知道 用户程序位于 虚拟硬盘的LBA逻辑扇区100 处;
加载程序 知道 虚拟机 内存物理地址0x10000处空闲;
加载程序 要把 用户程序 从虚拟硬盘里取出来,然后放到 虚拟机里空闲的内存空间那里;
加载程序 知道 虚拟机 开机后会读取 虚拟硬盘主引导扇区(LBA模式逻辑扇区号0) 的内容,将其复制到内存 0x0000:0x7c00处开始执行;
(我们)要做的事情
利用工具 nasmide.exe 编译加载程序的源文件.asm,生成一个.bin二进制文件,将.bin文件利用工具 fixvhdwr.exe 写入到虚拟硬盘的主引导扇区(LBA模式逻辑扇区号0)。
加载程序:增加注释
;
;文件名 c08-1.asm
;文件说明:硬盘主引导扇区代码(加载程序)
;创建日期:9:12 2018/5/23
app_lba_start equ 100 ;用户程序源地址的起始逻辑扇区号
SECTION mbr align=16 vstart=0x7c00
;设置栈段和栈指针
mov ax,0
mov ss,ax
mov sp,ax
mov ax,[cs:phy_base]
mov dx,[cs:phy_base+0x02]
mov bx,16
div bx ;物理地址0x10000 转换为 段地址0x1000
mov ds,ax
mov es,ax
;以下读取程序的起始部分
xor di,di ;28位起始逻辑扇区号的高12位
mov si,app_lba_start ;28位起始逻辑扇区号的低16位
xor bx,bx ; ???
call read_hard_disk_0
;以下判断整个用户程序有多大
mov dx,[2] ; 32位用户程序长度的高16位
mov ax,[0] ; 32位用户程序长度的低16位
mov bx,512 ; 1个扇区512字节
div bx
cmp dx,0 ; dx里存着余数,余数不为0代表没有除尽
jnz @1
dec ax
@1:
cmp ax,0 ; 小于1个扇区或者长度为512的整数倍时ax = 0
jz direct
; 读取剩余的扇区
push ds ; 用户程序的开头是基于LBA逻辑扇区号计算出来的段地址
mov cx,ax ; 循环次数(剩余的扇区数)
@2:
mov ax,ds
add ax,0