📄 boot_r.asm
字号:
[BITS 16]
BOOTSEG equ 07C0H
SYSSEG equ 01000H
SYSLEN equ 8
SETUPSEG equ 0x9000
start:
;进行段转移来设置各REG为BOOTSEG
; jmp BOOTSEG:go
;go:
; mov ax,cs
; mov ds,ax
; mov es,ax
; mov ss,ax
; mov sp,0x400
;------------------搬移自己到0x90000处---------------
mov ax,BOOTSEG
mov ds,ax
mov ax,SETUPSEG
mov es,ax
mov cx,128
xor si,si
xor di,di
rep movsd
jmp SETUPSEG:go
;--------------------------------
;------------------显示信息函数------------------
;功能描述: 在Teletype模式下显示字符串
;入口参数: AH=13H
;BH=页码
;BL=属性(若AL=00H或01H)
;CX=显示字符串长度
;(DH、DL)=坐标(行、列)
;ES:BP=显示字符串的地址 AL= 显示输出方式
; 0——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
; 1——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
; 2——字符串中含显示字符和显示属性。显示后,光标位置不变
; 3——字符串中含显示字符和显示属性。显示后,光标位置改变
;
;出口参数: 无
show_message:
mov cx,message_end-message
mov bx,0x0007 ; page 0, attribute 7 (normal)
mov bp,message
mov ax,0x1301 ; write string, move cursor
int 0x10
ret
;--------------------------------------------------------------
go:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0x400 ;堆栈大小为200h=512B
;---------------------显示字符串3000次My os is loading---------------
mov cx,3000
loop1:
push cx
call show_message
pop cx
dec cx
jnz loop1
;---------从A盘第2个扇区起读入SYSLEN个扇区到SYSSEG-----------
;BIOS的int 0x13中断调用
;入口参数: AH=02H
;AL=扇区数
;CH=柱面
;CL=扇区
;DH=磁头
;DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘
;ES:BX=缓冲区的地址
;出口参数: CF=0——操作成功,AH=00H,AL=传输的扇区数,
;否则,AH=状态代码,
load_system:
mov dx,0
mov cx,2
mov ax,SYSSEG
mov es,ax
mov bx,0
mov ax,0x200+SYSLEN
int 0x13
jnc ok_load
;如果不成功,磁盘系统复位
mov ah,0
int 0x13
jmp load_system
ok_load:
jmp SYSSEG:0 ;跳到SYSEG:0处去执行,也就是os.bin被装入内存的首地址
message:
;显示信息
db "My OS is loading..."
db 13,10,13,10
message_end:
db 0
times 510-($-$$) db 0
dw 0xAA55
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -