汇编网首页登录博客注册
scuzg的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
友情链接

[2009-08-10 12:41] 类似DOS功能调用09H的字符串显示子程序

图片载入中
DOS功能调用09H是实现字符串显示的软中断。该功能调用除不能指定显示位置及显示属性(前景色、背景色及是否闪烁)外,实现机理对初学者来说也是个“黑箱”。
    本文所述的字符串显示子程序,能“在指定位置、以指定属性显示指定的字符串”。由于这个子程序不依赖任何系统功能调用,所以能让我们看清楚字符串显示的内在机理。
    大家都知道计算机的显卡,它是在计算机的统一调度下完成显示的重要部件。显卡包含显示芯片和显示缓存,显示芯片是专司显示的协处理器,显示缓存是主机CPU和显示芯片都可以对其进行访问的“双口存储器”。字符显示的机理其实很简单:CPU 将要显示字符的ASC码及显示属性送入和指定显示位置对应的显示缓存的字节单元,定时扫描显示缓存的显示芯片就会将要显示的字符按指定的属性显示在屏幕上。
    字符显示模式的显示屏幕是一个 80 列、25 行的“网格”(如上图所示),每个网格对应两个字节单元,其中偶数字节单元用于存放要显示字符的ASC码,紧接其后的基数字节单元存放前一个字符要求的显示属性——这就是字符显示编程要做的工作。
    字符显示模式下显示缓存的起始物理地址是0B8000H,如果我们在这个单元中写入 41H ,屏幕的左上角将显示字符“A”:
        mov        ax,0b800h
        mov        es,ax
        mov        al,41h                ;或‘A'
        mov        es:[0],al

    字符显示属性字节的低 4 位为前景色,即字符的颜色,一共可以有 16 种颜色;属性字节高 4 位的低 3 位为背景色,即背景可以有 7 种选择;属性字节的最高位决定指定的字符是否闪烁: 0 为正常显示,1 则闪烁显示。
    如何由指定的行和列定位到对应的显示缓存字节单元,仅需要几次简单的乘法和加法运算即可,这通过阅读下面示例的注释应该很容易明白。
    本文所述的字符串显示子程序描述如下:

子程序名:DrctShw
子程序功能:在指定位置、以指定属性显示指定的字符串
参数说明:
     bh————指定显示行
     bl————指定显示列
     ah————指定显示属性
     ds:si——指定要显示的字符串

下面是使用本文所述字符串显示子程序显示“Hello,World!"的示例:

stack0  segment stack 'stack'
        dw         40h dup(0)        
stack0  ends

data    segment
Hello   db        "Hello,World!",0        
data    ends

code    segment
        assume  cs:code,ds:data,ss:stack0
main:   mov        ax,data                
        mov        ds,ax
        ;指定显示位置:行、列
        mov        dh,10                
        mov        dl,8
        ;以指定的属性:黄字、蓝底、正常(不闪烁)显示
        mov        ah,1eh                
        ;指定待显示字符串
        lea        si,Hello
        call        DrctShw
 
        mov        ah,0                
        int        16h

        mov        ah,4ch
        int        21h

DrctShw proc
        push        bx                
        push        di
        push        es
        ;es 指向显示缓存段
        mov        bx,0b800h        
        mov        es,bx
        ;在 bh 中暂存显示属性
        mov        bh,ah
        ;定位到指定的行
        mov        al,dh
        dec        al
        mov        bl,160
        mul        bl
        mov        di,ax
        ;定位到指定的列
        mov        al,dl                
        mov        bl,2
        mul        bl
        ;di 指向和指定行、列对应的显示缓存的首址
        add        di,ax
        ;将显示属性送回 ah        
        mov        ah,bh
        ;逐个取出待显示字符        
Next:   mov        al,[si]                
        ;判断是否为串尾
        cmp        al,0                
        jz        rtrn
        ;将待显示字符及属性一同放入显示缓存
        mov        es:[di],ax        
        inc        di
        inc        di
        inc        si
        jmp        Next        
rtrn:   
        pop        es        
        pop        di        
        pop        bx        
        ret
DrctShw endp
code    ends
        end        main
评论次数(3)  |  浏览次数(2306)  |  类型(汇编语言) |  收藏此文  | 

[  younggay   发表于  2009-08-11 11:58  ]

再学习《汇编语言》的过程中也做过这样的小程序。我绝的这个程序应该在前面的参数应该还得写明ds的作用,或者说ds:si指向待显示字符串,还有就是字符串的格式的说明,否则这个子功能别人用起来不清晰。

[  scuzg   发表于  2009-10-29 07:40  ]

接受younggay意见,修改子程序参数说明。

[  游客   发表于  2010-01-08 11:05  ]

看来我基础知识还是不牢固啊,有些东西还是看不明白, 还需努力

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码