利用INT 0X10中断
◆ 读光标位置:
功能号:AH = 03H
传入参数:BH = 页号
返回参数:CH = 光标起始行
CL = 光标结束行
DH/DL = 行/列
◆ 显示字符串:
功能号:AH = 13H
输入参数:ES:BP = 字符串地址
AL = 写方式(0~3)
CX = 字符串长度
DH/DL = 起始行/列
BH/BL = 页号/属性
; mbr.S
; 主引导程序
; --------------------------------------------------
SECTION MBR vstart=0x7c00 ; 把起始地址编译为 0x7c00
mov ax, cs ; cs 代码段寄存器
mov ds, ax ; dx 数据段寄存器
mov es, ax ; es 附加段寄存器
mov ss, ax ; ss 堆栈段寄存器
mov fs, ax ; fs 80386 后添加的寄存器,无全称
mov sp, 0x7c00 ; sp 堆栈指针寄存器
; 清屏
; --------------------------------------------------
; INT 0x10 功能号: 0x06 功能描述:上卷窗口
; --------------------------------------------------
; 输入:
; AH 功能号 = 0x06
; AL = 上卷的行数(如果为0,表示全部)
; BH = 上卷行属性
; (CL, CH) = 窗口左上角的 (X, Y) 位置
; (DL, DH) = 窗口右下角的 (X, Y) 位置
; 无返回值:
mov ax, 0x600
mov bx, 0x700
mov cx, 0
mov dx, 0x184f ; 右下角: (80, 25)
; VGA 文本模式种,一行只能容纳 80 个字符,共 25 行
; 下标从 0 开始,所以 0x18=24, 0x4f=79
int 0x10 ; int 0x10
;;;;;;;;;;;;;下面这三行代码获取光标位置;;;;;;;;;;;;;;;;
; .get_cursor 获取当前光标位置,在光标处打印字符
mov ah, 3 ; 3 号子功能
mov bh, 0 ; 待获取光标的页号
int 0x10 ; 输出:
; ch = 光标开始行,cl = 光标结束行
; dh = 光标所在行号,dl = 光标所在列号
; 打印字符串
mov ax, message
mov bp, ax ; es:bp 为串首地址
mov cx, 5 ; cx 为串长度,不包括结束符 '\0'
mov ax, 0x1301 ; 13 号子功能
; ah = 13
; al = 01: 写字符方式,显式字符串,光标跟随移动
mov bx, 0x2 ; bh = 0,要显示的页号
; bl = 02,字符属性,黑底绿字
int 0x10
;;;;;;;;;;;;;;;;;;;;;;打印字符串结束;;;;;;;;;;;;;;;;
jmp $; 程序悬停在此
message db "1 MBR"
times 510-($-$$) db 0
db 0x55,0xaa