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