| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- ; 主引导程序
- ; ----------------------------------------------------------------
- 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
|