int 10H 显示字符串功能在《自己动手写OS》第五章代码中的分析

来源:互联网 发布:熊猫人之谜音乐知乎 编辑:程序博客网 时间:2024/06/05 20:41

 读到《自己动手写OS》第五章,对于多次出现的int 10H 中断做个小小的分析。

对于清屏操作:

功能号:06H和07H

功能:初始化屏幕或滚屏
入口参数:AH=06H—向上滚屏,07H—向下滚屏
          AL=滚动行数(0—清窗口)
          BH=空白区域的缺省属性
          (CH、CL)=窗口的左上角位置(Y坐标,X坐标)
          (DH、DL)=窗口的右下角位置(Y坐标,X坐标)
出口参数: 无
这个操作不再赘述。

这里主要讲一下显示字符串的操作中断。
我们先来看一下传参情况:

功能号:13H

功能:在Teletype模式下显示字符串
入口参数:AH=13H
          BH=页码
          BL=属性(若AL=00H或01H)
          CX=显示字符串长度
          (DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址 AL= 显示输出方式
 0—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
 1—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变

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

在  Tinix/chapter5/d  中的boot.asm代码中,DispStr 函数如下:

DispStr:

 mov ax, MessageLength
 mul dh          ;注意!dh也是参数,代表字符串的行号
 add ax, BootMessage
 mov bp, ax   ; ┓
 mov ax, ds   ; ┣ ES:BP = 串地址
 mov es, ax   ; ┛
 mov cx, MessageLength ; CX = 串长度
 mov ax, 01301h  ; AH = 13,  AL = 01h
 mov bx, 0007h  ; 页号为0(BH = 0) 黑底白字(BL = 07h)
 mov dl, 0
 int 10h  
 ret

由红色字段可见字符从dh行dl列开始显示,显示后,光标位置改变(若AL=0,则显示字符后光标停留在原处)

在  Tinix/chapter5/d  中的loader.asm代码中,DispStrRealMod 函数如下:

 mov ax, MessageLength
 mul dh
 add ax, LoadMessage
 mov bp, ax   ; ┓
 mov ax, ds   ; ┣ ES:BP = 串地址
 mov es, ax   ; ┛
 mov cx, MessageLength ; CX = 串长度
 mov ax, 01300h  ; AH = 13,  AL = 01h
 mov bx, 0007h  ; 页号为0(BH = 0) 黑底白字(BL = 07h)
 mov dl, 0
 add dh, 3   ; 此处注意!字符串序号+3 为最后的行号
 int 10h  
 ret
因此,若调用函数前dh=0,则在第3行(从第0行开始计数)显示字符串Loading

 

原创粉丝点击