操作系统真相还原 第二章 第一次编写mbr

利用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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值