显示字符
Posted mlzrq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了显示字符相关的知识,希望对你有一定的参考价值。
显示字符
显示字符中断
显示中断: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中断操作显卡。输出字符
显示一个字符
;------------------
;显示一个字符,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中断操作显卡。输出字符
循环调用,显示字符串
通过中断来显示一个字符,我们可以通过循环操作字符中断的方式,来显示多个字符。
显示字符串代码
; ------------------------------------------------------------------------
; 显示字串函数:PutString
; 参数:
; si = 字符串文本地址
; ------------------------------------------------------------------------
PutString:
;------------------
;显示一个字符,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
代码调用
这一段的代码如下:
boot.asm
;Rats OS
[bits 16]
org 0x7c00 ;指明程序的偏移的基地址
;引导扇区代码
jmp Entry
db 0x90
db "RATSBOOT" ;启动区的名称可以是任意的字符串(8字节)
;程序核心内容
Entry:
mov ah,0x06 ;清除屏幕
mov al,0
mov cx,0
mov dx,0xffff
mov bh,0x17 ;属性为蓝底白字
int 0x10
mov ah,0x02 ;光标位置初始化
mov dx,0
mov bh,0
mov dh,0x0
mov dl,0x0
int 0x10
;---------------------------
;输出字符串
mov si,HelloMsg ;将HelloMsg的地址放入si
call Func_Sprint ;调用函数
jmp $ ;进入死循环,不再往下执行。
; ------------------------------------------------------------------------
; 显示字串函数:Func_Sprint
; 参数:
; si = 字符串开始地址,
; ------------------------------------------------------------------------
Func_Sprint:
.cprint:
mov al,[si] ;将[di]指向的内存单元的一个字节放入AL。
inc si ;di指向下一个字节
cmp al,0 ;判断[di]中的字符值是否==0
je .printEnd ;为0字符则串结束
mov ah,0x0e ;BIOS中断参数:中断模式
mov bl,0x03 ;BIOS中断参数:指定字符颜色
int 0x10 ;调用BIOS中断操作显卡。输出字符
jmp .cprint
.printEnd:
ret
; ------------------------------------------------------------------------
;准备显示字符串
HelloMsg: db "hello,ratsos!",0
FillSector:
resb 510-($-$$) ;处理当前行$至结束(1FE)的填充
db 0x55, 0xaa
Makefile文件
# tools
NASM=nasm
QEMU=qemu-system-x86_64
# args
boot=boot
build=build
target: prepare image
$(QEMU) -m 128 -localtime -fda $(build)/ratsos.img
image: prepare $(build)/ratsos.img
$(build)/ratsos.img:
$(NASM) -f bin -o $(build)/ratsos.img $(boot)/boot.asm
prepare:
ifeq ($(build), $(wildcard $(build)))
@echo "build directory exist..."
else
mkdir -p $(build)
endif
clean:
rm -rf $(build)/*
以上是关于显示字符的主要内容,如果未能解决你的问题,请参考以下文章
带有神秘附加字符的 Javascript Date getTime() 代码片段