目录 上一页 下一页 下一章

-146- PC机汇编语言实战精解

dispmsg:









exit:








main
code


lodsb
or
jz
mov
stosw
add
inc
jmp

mov
int

mov
mov
int

mov
int
endp
ends
end


al,al
exit
ah,attr

di,80
attr
dispmsg

ah,0
16h

ah,0
al,mode
10h

ah,4ch
21h


main

;取得一个字符
;已经到了字符串结尾了吗?
;已到结尾,转EXIT退出
;属性字节送入AH寄存器
;将ASCII码与属性一同写入显示缓存中
;DI寄存器后移80个字节
;属性字节加1
;转DISPMSG继续显示下一个字符

;等待键盘输入


;恢复原来的显示模式



;结束进程




  我尽量使每个程序都有富于趣味性的输出,不知大家对这个程序的输出结果是否有兴趣。这个程序给我们提出了两个问题:第一,为什么这一串文字是倾斜的?第二,为什么paradise一词中第二个字母a 是一个蓝方块?
  答案十分简单:首先指令stosw可以让DI寄存器自动加2,因此当我们给DI加上80的时候,DI寄存器的实际增量是82,所以DI指向了下一行的下一列。大家可以修改程序给DI加上78,想想输出结果会是什么样子,然后运行程序看看实际输出和想象中是否一致。至于那个字母"a"的去向就更不用多说,我们每显示一个字符就将属性值加1,显示字符"a"时属性值恰好是11H,所以字符"a"和背影融为一体了。
  这个程序十分简单,不过它很形象地说明了每个字符行与显示缓存中的80个字节的对应关系。下面这个程序稍微复杂一些,其中的子过程outchar可以接收字符的行号与列号,由它自行算出偏移量。
PARADISE
data

msg
mode
data
.ASM
segment
assume
db'Enter
db
ends


ds:data
into the paradise.',0
?




;定义一个字符串
;保存当前的显示模式


Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章