码迷,mamicode.com
首页 > 其他好文 > 详细

显示字符

时间:2019-01-05 00:18:35      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:nasm   fill   核心   asm   eve   car   build   int   属性   

显示字符

显示字符中断

显示中断: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)/*

显示字符

标签:nasm   fill   核心   asm   eve   car   build   int   属性   

原文地址:https://www.cnblogs.com/mlzrq/p/10223031.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!