回 帖 发 新 帖 刷新版面

主题:字符显示函数show_str (附, 编成背景知识)

函数

名称: show_str

功能: 在指定的位置, 用指定的颜色, 显示一个用 0 结束的字符串

参数: (ch) = 行号( 取值范围 2 ~ 24 ), (dl) = 列号( 取值范围
     0 ~ 79) , (cl) = 颜色, ds:si 指向字符串首地址

返回: 无



编程背景知识:

80 * 25 彩色字符模式显示缓冲区(以下简称显示缓冲区 )的结构:
内存地址空间中, B8000H ~ BFFFFH 共 32KB 的空间, 为 80 * 25 彩色模式的显示缓冲区.向这个地址空间写数据,写入的内容将立即出现在显示器上.

在 80 * 25 彩色模式下, 显示器可以显示 25  行, 每行 80 个字符, 每个字符可以有 256 种属性 ( 背景色, 前景色, 闪烁, 高亮 等组合信息 ).

这样, 一个字符在显示缓冲区要占两个字节, 分别存放 字符的 ASCII 码和属性. 80 * 25 模式下, 一屏的内容在显示缓冲区共占 4000 个字节.

显示缓冲区分为 8 页, 每页 4KB ( 约 4000B ), 显示器可以显示任意一页内容. 一般情况下, 显示第 0 页的内容. 也就是说, 通常情况下, B8000 ~ B8F9F 中的 4000 个字节的内容将出现在显示器上.

在一页显示缓冲区中:

 偏移 000 ~ 09F 对应显示器上的第 1 行( 80个字符, 占 1                            60 个字节 );
 偏移 0A0 ~ 13F 对应显示器上的第 2 行;
 偏移 140 ~ 1DF 对应显示器上的第 3 行.

依此类推, 可以偏移 F00 ~ F9F 对应显示器上的第 25 行.

在一行中, 一个字符占 2 个字节的存储空间( 一个字 ), 低位字节存储字符的 ASCII 码, 高位字节存储字符的属性. 一共 80 个字符, 占 160 个字节.

即在一行中:


 00 ~ 01 单元对应显示器上的第 1 列;
  02 ~ 03 单元对应显示器上的第 2 列;
 04 ~ 05 单元对应显示器上的第 3 列;

依此类推, 可知, 9E ~ 9F 单元对应显示器上的第 80 列。



具体字节属性请有兴趣者调试得到。


谢谢。。。

回复列表 (共1个回复)

沙发


;2005-12-12 14:03:56
;函数
;名称: show_str
;功能: 在指定的位置,用指定的颜色,显示一个用 0 结束的字符串
;参数: (ch) = 行号(取值范围 2 ~ 24), (dl) = 列号(取值范围 0 ~ 79),
;         (cl) = 颜色, ds:si 指向字符串首地址
;返回: 无

;编程背景知识:
;80 * 25 彩色字符模式显示缓冲区(以下简称显示缓冲区)的结构:内存地址空间中,
;B8000H ~ BFFFFH 共 32KB 的空间, 为 80 * 25 彩色模式的显示缓冲区.向这个地
;址空间写数据,写入的内容将立即出现在显示器上.在 80 * 25 彩色模式下,显示器
;可以显示 25 行,每行 80 个字符, 每个字符可以有 256 种属性 (背景色,前景色,
;闪烁,高亮 等组合信息).这样, 一个字符在显示缓冲区要占两个字节, 分别存放
;字符的 ASCII 码和属性.80 * 25 模式下,一屏的内容在显示缓冲区共占 4000 个字节.
;显示缓冲区分为 8 页,每页 4KB (约 4000B),显示器可以显示任意一页内容.一般情
;况下,显示第 0 页的内容.也就是说,通常情况下,B8000 ~ B8F9F 中的 4000 个字节
;的内容将出现在显示器上.

;在一页显示缓冲区中:
;偏移 000 ~ 09F 对应显示器上的第 1 行(80个字符,占 160 个字节 );
;偏移 0A0 ~ 13F 对应显示器上的第 2 行;
;偏移 140 ~ 1DF 对应显示器上的第 3 行.

;依此类推,可以偏移 F00 ~ F9F 对应显示器上的第 25 行.在一行中,一个字符占 2 个字
;节的存储空间(一个字),低位字节存储字符的 ASCII 码,高位字节存储字符的属性. 一共
;80 个字符, 占 160 个字节.
;即在一行中:
;00 ~ 01 单元对应显示器上的第 1 列;
;02 ~ 03 单元对应显示器上的第 2 列;
;04 ~ 05 单元对应显示器上的第 3 列;
;依此类推, 可知, 9E ~ 9F 单元对应显示器上的第 80 列。

.model small

.data
pszMsg    db    'Hi, Dummy!', 0
.code
_main:
            mov        ax, @data
            mov        ds, ax

            mov        ch, 12
            mov        dl, 30
            mov        cl, 10010100B
            lea        si, pszMsg
            call    show_str

            mov        ax, 4C00H
            int        21H
show_str    proc
            push    es
            push    di

            mov        ax, 0B800H
            mov        es, ax

            xor        ah, ah
            xor        dh, dh
            push    dx
            mov        di, 160
            mov        al, ch
            mul        di
            pop        di
            shl        di, 1
            add        di, ax
            cld
            mov        ah, cl
    _next_char:
            lodsb
            test    al, al
            jz        _ret_show_str
            stosw
            jmp        _next_char
    _ret_show_str:
            pop        di
            pop        es
            ret
show_str    endp
end _main

我来回复

您尚未登录,请登录后再回复。点此登录或注册