2.6 显示字符串_字符串中断方式

显示字符串

字符串中断

通过AH=13H中断来显示字符串。

1. 字符串中断

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

首先需要配置入口参数:

中断号:INT10

寄存器说明
AH功能:在Teletype模式下显示字符13H
AL显示输出方式----
BH页码---
BL属性,背景色和文字颜色---
CX字符串长度---
DH, DL坐标(行,列)---
ES, BP字符串的地址---

AL=显示输出方式

0--字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变

1--字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变

2--字符串中含显示字符和显示属性。显示后,光标位置不变

3--字符串中含显示字符和显示属性。显示后,光标位置改变

显示字符串函数

我们设置字符串遇到0表示结束,然后将读取的内容调用BIOS中断进行显示。

此处使用汇编定义了一个显示字符串的函数。然后进行调用。

函数如下:

; ------------------------------------------------------------------------
; 显示字符串函数:PrintString
; 参数:
; si = 字符串开始地址,
; dh = 第N行,0开始
; dl = 第N列,0开始
; ------------------------------------------------------------------------
PrintString:
            mov cx,0            ;BIOS中断参数:显示字符串长度
            mov bx,si
    .s1:;获取字符串长度
            mov al,[bx]         ;读取1个字节到al
            add bx,1            ;读取下个字节
            cmp al,0            ;是否以0结束
            je .s2
            add cx,1            ;计数器
            jmp .s1
    .s2:;显示字符串
            mov bx,si
            mov bp,bx
            mov ax,ds
            mov es,ax           ;BIOS中断参数:计算[ES:BP]为显示字符串开始地址

            mov ah,0x13         ;BIOS中断参数:显示文字串
            mov al,0x01         ;BIOS中断参数:文本输出方式(40×25 16色 文本)
            mov bh,0x0          ;BIOS中断参数:指定分页为0
            mov bl,0x1F         ;BIOS中断参数:指定白色文字            
            mov dl,0            ;列号为0
            int 0x10            ;调用BIOS中断操作显卡。输出字符串
            ret

程序代码

内容如下

;ratsOS
[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
    mov dh,0                ;设置显示行
    mov dl,0                ;设置显示列
    call PrintString        ;调用函数
    
    jmp $                   ;进入死循环

            
;准备显示字符串
HelloMsg: db "hello,ratsos!",0

; ------------------------------------------------------------------------
; 显示字符串函数:PrintString
; 参数:
; si = 字符串开始地址,
; dh = 第N行,0开始
; dl = 第N列,0开始
; ------------------------------------------------------------------------
PrintString:
            mov cx,0            ;BIOS中断参数:显示字符串长度
            mov bx,si
    .s1:;获取字符串长度
            mov al,[bx]         ;读取1个字节到al
            add bx,1            ;读取下个字节
            cmp al,0            ;是否以0结束
            je .s2
            inc cx              ;计数器
            jmp .s1
    .s2:;显示字符串
            mov bx,si
            mov bp,bx
            mov ax,ds
            mov es,ax           ;BIOS中断参数:计算[ES:BP]为显示字符串开始地址

            mov ah,0x13         ;BIOS中断参数:中断模式
            mov al,0x01         ;BIOS中断参数:输出方式
            mov bh,0x0          ;BIOS中断参数:指定分页为0
            mov bl,0x1F         ;BIOS中断参数:显示属性,指定白色文字           
            int 0x10            ;调用BIOS中断操作显卡。输出字符串
            ret


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

运行

结果如图

1573351-20190303192702510-1851186152.gif

代码地址

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

转载于:https://www.cnblogs.com/mlzrq/p/10223039.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值