显示字符
字符中断显示字符串
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
运行
结果如图