;实验目的 实现可自行启动的计算机,以达成对本书知识理解的检验[/size][/b];CPU上电 -> CS:IP = FFFF:0 -> JMP BIOS硬件检测系统和初始化程序 -> int 19H -> 读取 Floppy 0面0道1区 的512byte数据到0:7C00H后从此处执行
;以上全为硬件自动步骤
;实验要求:
; 实现功能 1.rest PC 2.start system 3.clock 4.set clock
; 1. 应考虑FFFF:0
; 2. C盘 0面0道1扇区
;任务拆解 1.软盘写入程序 2.引导程序 3.主程序
;2025年7月12日07点17分
;需要注意的是,三段程序互相独立
;masm标签是全局符号,不允许多段同名
;烧录程序
FlasherCode segment
assume cs:FlasherCode
FlasherCode_start:
;写入Bootloader
mov dx,0
mov ax,offset BootloaderCode:BootloaderCode_end - offset BootloaderCode:BootloaderCode_start
mov bx,512
div bx ;ax商 dx余数
cmp dx,0
je short FlasherCode:FlasherCode_start_p0
inc al
FlasherCode_start_p0:
mov ah,1 ;写入
mov al,al
mov dx,0 ;Floppy 0号逻辑扇区看是
mov bx,BootloaderCode ;用寄存器前先看其是否为参数寄存器!!!
mov es,bx
mov bx,offset BootloaderCode:BootloaderCode_start
call FlasherCode:FlasherCode_disk_access
;写入MainApp
mov dx,0
mov ax,offset MainAppCode:MainAppCode_end - offset MainAppCode:MainAppCode_start
mov bx,512
div bx ;ax商 dx余数
cmp dx,0
je short FlasherCode:FlasherCode_start_p1 ;直接对代码复制别忘记修改跳转标签!!!
inc al
FlasherCode_start_p1:
mov ah,1 ;写入
mov al,al
mov dx,1 ;Floppy 1号逻辑扇区开始
mov bx,MainAppCode
mov es,bx
mov bx,offset MainAppCode:MainAppCode_start
call FlasherCode:FlasherCode_disk_access
mov ax,4C00H
int 21H
FlasherCode_disk_access:
;涉及到堆栈,DOS下无需手动指定,但自有系统必须自行设置,否则属于未定义寄存器!
;ah寄存器传递功能号 0-读取 1-写入
;al写入扇区数
;dx-逻辑区号
;es:bx-内存区
;保存寄存器 ax bx cx dx bp
push ax
push bx
push cx
push dx
push bp
;逻辑地址 -> 物理地址
mov ax,dx
mov dx,0
mov bx,1440 ;此处已修改bx!
div bx ;ax->int dx->rem
; 写入内存以便理清思路 -> 存在优化空间
; mov bp,sp
; push ax ; [bp - 2] -> int (逻辑扇区号/1440) ->dh
; push dx ; [bp - 4] -> rem (逻辑扇区号/1440)
; mov ax,ss:[bp - 4]
; mov bl,18
; div bl ;al->int (rem (逻辑扇区号/1440)) ah->rem (rem (逻辑扇区号/1440))
; mov ch,0
; mov cl,al
; push cx ; [bp - 6] -> int (rem (逻辑扇区号/1440)) -> ch
; mov cl,ah
; push cx ; [bp - 8] -> rem (rem (逻辑扇区号/1440)) -> ~ + 1 ->cl
mov bp,sp
push ax ; [bp - 2] -> int (逻辑扇区号/1440) ->dh
push dx ; [bp - 4] -> rem (逻辑扇区号/1440)
mov ax,ss:[bp - 4]
mov bl,18
div bl ;al->int (rem (逻辑扇区号/1440)) ah->rem (rem (逻辑扇区号/1440))
mov ch,al
mov cl,ah
inc cl
mov ax,ss:[bp - 2]
mov dh,al
mov ah,ss:[bp + 9]
add ah,2
mov al,ss:[bp + 8]
mov dl,0 ;A盘
mov bx,ss:[bp + 6]
int 13H
;恢复堆栈和寄存器
add sp,4 ;释放堆栈是相加!!!
pop bp
pop dx
pop cx
pop bx
pop ax
ret
FlasherCode ends
;引导程序
BootloaderCode segment
assume cs:BootloaderCode
; public BootloaderCode_start,BootloaderCode_end
BootloaderCode_start:
;测试用代码
mov ax,0B800H
mov es,ax
mov byte ptr es:[0], mov byte ptr es:[1],2
BootloaderCode_end:
nop
BootloaderCode ends
;主程序
MainAppCode segment
assume cs:MainAppCode
; public MainAppCode_start,MainAppCode_end
MainAppCode_start:
nop
MainAppCode_end:
nop
MainAppCode ends
end FlasherCode_start