显示字符

字符中断显示字符串

1. 字符中断

显示中断:INT10,显示字符:AH=0EH

当BIOS执行显示字符串调用显示服务 INT 10H,AH=0EH,可以进行单个字符的显示

首先需要配置入口参数:

寄存器

说明


AH

在Teletype模式下显示字符

0EH

AL

字符

---

BH

页码

---

BL

前景色(图形模式)

---

例如:

mov byte al,'A'
mov ah,0x0e             ;BIOS中断参数:显示一个文字
mov bl,0x03             ;BIOS中断参数:指定字符颜色
int 0x10                ;调用BIOS中断操作显卡。输出字符

2. 显示一个字符

;------------------
;显示一个字符,si = 字符串文本地址
.putChar:
    mov al,[si]             ;将[di]指向的内存单元的一个字节放入AL。
    inc si                  ;di指向下一个字节
    cmp al,0                ;判断[di]中的字符值是否==0

    je .putEnd          ;为0字符则串结束
    mov ah,0x0e             ;BIOS中断参数:中断模式
    mov bl,0x03             ;BIOS中断参数:指定字符颜色
    int 0x10                ;调用BIOS中断操作显卡。输出字符

3.循环调用,显示字符串

通过中断来显示一个字符,我们可以通过循环操作字符中断的方式,来显示多个字符。

显示字符串代码

; ------------------------------------------------------------------------
; 显示字串函数:Print_String
; 参数:
; si = 字符串文本地址
; ------------------------------------------------------------------------
Print_String:
    ;------------------
    ;显示一个字符,si = 字符串文本地址
    .putChar:
        mov al,[si]             ;将[di]指向的内存单元的一个字节放入AL。
        inc si                  ;di指向下一个字节
        cmp al,0                ;判断[di]中的字符值是否==0

        je .putEnd              ;为0字符则串结束
        mov ah,0x0e             ;BIOS中断参数:中断模式
        mov bl,0x03             ;BIOS中断参数:指定字符颜色
        int 0x10                ;调用BIOS中断操作显卡。输出字符
        jmp .putChar
   .putEnd:
        ret

4. 代码

这一段的代码如下:
boot.asm

;ratsos
[bits 16]
    org     0x7c00          ;指明程序的偏移的基地址

;引导扇区代码  
    jmp     Entry
    db      0x90
    db      "RATSBOOT"              ;启动区的名称可以是任意的字符串(8字节)       

;程序核心内容
Entry:

    ;---------------------------
    ;清除屏幕       
    mov ah,0x06             
    mov bh,0x07                 
    mov al,0
    mov cx,0   
    mov dx,0xffff  
    mov bh,0x17             ;属性为蓝底白字
    int 0x10
    
    ;---------------------------            
    ;光标位置初始化
    mov ah,0x02             
    mov bh,0
    mov dx,0
    int 0x10

    ;---------------------------
    ;输出字符串
    mov  si,HelloMsg            ;将HelloMsg的地址放入si
    call Print_String           ;调用函数
    
    jmp $               ;进入死循环,不再往下执行。

; ------------------------------------------------------------------------
; 字符串常量
HelloMsg: db "hello,ratsos!",0


; ------------------------------------------------------------------------
; 显示字串函数:Print_String
; 参数:
; si = 字符串文本地址
; ------------------------------------------------------------------------
Print_String:
    ;------------------
    ;显示一个字符,si = 字符串文本地址
    .putChar:
        mov al,[si]             ;将[di]指向的内存单元的一个字节放入AL。
        inc si                  ;di指向下一个字节
        cmp al,0                ;判断[di]中的字符值是否==0

        je .putEnd              ;为0字符则串结束
        mov ah,0x0e             ;BIOS中断参数:中断模式
        mov bl,0x03             ;BIOS中断参数:指定字符颜色
        int 0x10                ;调用BIOS中断操作显卡。输出字符
        jmp .putChar
   .putEnd:
        ret
        

FillSector:
    resb    510-($-$$)          ;处理当前行$至结束(1FE)的填充
    db      0x55, 0xaa

运行

结果如图

ti bios 软中断 计算机bios设置中断_github

代码地址

https://github.com/sxt102400/ratsos/tree/master/chapter2.5