- [游客] 说的不错,但是现在国人能有多少个学习这个的时候还能有开拓视野的想法。。。 04/08 09:13
- [scuzg] 0fch展开成二进制数: 11111100,其中最高位是符号位,所以: 7ch+4=80h=12 12/20 19:05
- [842460904] 理论是应该负数原码和补码数值之和等于128,可为什么。fc和它的补码-4相加,即252+(-4)=? 09/03 23:38
- [fpamc] 顶顶…… 05/25 09:49
- [scuzg] 20位,图中有说明。 12/29 15:45
- [scuzg] 表示8位二进制数的16进制数fdh,因高位是f,所以前面前缀0以区别于标识符,也就是说,当对应8位二 12/29 15:42
- [powerofthinking] 博主的文章不错,希望再多写几篇。 12/18 13:40
- [游客] 请问0fdh为什么不是0000 1111 1101 b ?如果最高位视为符号位,它就是一个带符号数, 12/17 23:08
- [游客] 请问scuzg老师,地址加法器是多少位的啊(物理连接结构)?寄存器是16位,地址线20位,地址加法器 12/17 23:02
- [游客] 地址译码逻辑是不是应该在CPU内部啊? 我也觉得文章有点问题,还有就是看了scuzg老师很多文章, 12/17 22:59
- [qqqun238564439] 厉害 04/10 10:57
- [suixin] 少了个你,呵呵 “看着你的回答真长见识” 12/01 09:31
- [suixin] 看着的回答真长见识 12/01 09:29
- [fangorc] 先弄个友情链接,老师这的好东西太多了,慢慢消化~ 08/07 22:03
- [zdpopup] 谢谢scuzg 的宝贵意见,我看了2次你的话 08/05 01:43
- [游客] 过来踩踩。哈哈!端他爸 08/03 11:28
[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
本文所述的字符串显示子程序,能“在指定位置、以指定属性显示指定的字符串”。由于这个子程序不依赖任何系统功能调用,所以能让我们看清楚字符串显示的内在机理。
大家都知道计算机的显卡,它是在计算机的统一调度下完成显示的重要部件。显卡包含显示芯片和显示缓存,显示芯片是专司显示的协处理器,显示缓存是主机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) |
类型(汇编语言) |
收藏此文 |