|
|
@@ -0,0 +1,66 @@
|
|
|
+; 主引导程序
|
|
|
+; ----------------------------------------------------------------
|
|
|
+SECTION MBR vstart=0x7c00
|
|
|
+ mov ax, cs ; 0x00000000
|
|
|
+ mov ds, ax
|
|
|
+ mov es, ax
|
|
|
+ mov ss, ax
|
|
|
+ mov fs, ax
|
|
|
+ mov sp, 0x7c00
|
|
|
+
|
|
|
+ call CleanDisply
|
|
|
+ call GetCursorPosition
|
|
|
+ call DispStr
|
|
|
+ jmp $
|
|
|
+
|
|
|
+
|
|
|
+;清屏,利用 0x06 号功能,上巻全部行,则可清屏
|
|
|
+; ----------------------------------------------------------------
|
|
|
+; INT 0X10 功能号:0x06 功能描述:上巻窗口
|
|
|
+; AL=上卷行数
|
|
|
+; AL=0 整个窗口空白
|
|
|
+; BH=卷入行属性
|
|
|
+; CH=左上角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标)
|
|
|
+; CL=左上角列号
|
|
|
+; DH=右下角行号 (DH、DL)=窗口的右下角位置(Y坐标,X坐标)
|
|
|
+; DL=右下角列号
|
|
|
+; ----------------------------------------------------------------
|
|
|
+CleanDisply:
|
|
|
+ mov ah, 0x06 ; 功能号
|
|
|
+ mov al, 0x00 ; 上巻的行数(如果为 0,表示全部)
|
|
|
+ mov bx, 0x700
|
|
|
+ mov cx, 0 ; 左上角:(0,0)
|
|
|
+ mov dx, 0x184f ; 右下角: (80, 25)
|
|
|
+ ; VGA 文本模式中,一行只能容纳 80 个字符,共 25 行.
|
|
|
+ ;下标、从 0 开始,所以 Ox18=24, 0x4f=79
|
|
|
+ int 0x10 ; 调用 INT 0x10 功能
|
|
|
+ ret
|
|
|
+
|
|
|
+
|
|
|
+;;;;;;;;;;;; 获取光标位置 ;;;;;;;;;;;;;
|
|
|
+; .get_cursor_position, 在光标位置打印字符
|
|
|
+GetCursorPosition:
|
|
|
+ mov ah, 0x3 ; 3 号功能是获取光标位置,需要
|
|
|
+ mov bh, 0 ; 待获取光标的页号
|
|
|
+
|
|
|
+ int 0x10
|
|
|
+ ret
|
|
|
+;;;;;;;;;;;; 获取光标位置结束 ;;;;;;;;;
|
|
|
+
|
|
|
+; 13 号子功能打印字符串
|
|
|
+;--------------------------------------------------------
|
|
|
+;--------------------------------------------------------
|
|
|
+DispStr:
|
|
|
+ mov ax, BootMessage
|
|
|
+ mov bp, ax ; ss:bp 为串首地址
|
|
|
+
|
|
|
+ mov cx, 16 ; 串长度,不包括结束符个数
|
|
|
+ mov ax, 0x01301 ; 子功能号 13 显示字符及属性
|
|
|
+ ; al 设置写字符方式 al=01: 显示字符串,光标跟随移动
|
|
|
+ mov bx, 0x2 ; bh 显示的页号 bl 是字符属性,黑底绿字(bl=02h)
|
|
|
+ mov dl, 0
|
|
|
+ int 0x10
|
|
|
+ ret
|
|
|
+BootMessage: db "Hello OS World"
|
|
|
+times 510 - ($-$$) db 0
|
|
|
+db 0x55, 0xaa
|