- [baizengfei] 学习了,我就是死在这道题上的。。。。。。 01/06 12:14
- [qinaode12] 主要是换成用列的顺序去修改显存简化了程序!因为每列字符的Ascii码值是相同的,因此可以只对数据段中 12/14 20:42
- [qinaode12] 程序我都是编译连接运行了的,要是我没有运行成功,我是不会写上去的。呵呵!今天又写了一个简单点的,是用 12/14 20:11
- [deepblue] 你说的不错,我想按你的思路是能实现的。 但是你的程序我试了一下有问题啊 。 12/13 16:02
- [qinaode12] 很慢啊。慢慢来!呵呵! 12/13 12:18
- [martian] 博主检测点做到第7张了,博客上没有什么帖子,不知道学习进度如何啊? 12/10 19:44
- [qinaode12] 我有分析的哦。呵呵。你没仔细看,在关键地方我是加了分析,或注意的。 12/09 18:04
- [mouse] 光有答案啊,分析呢?答案做对了但并不代表分析一定对了. 建议看看这篇文章 http://ww 12/04 10:16
- [mess] 可以当个手册查查,用翻译软件翻译一下错误信息也能猜测个大概:-) 11/28 13:58
- [游客] 支持一下。 11/26 18:55
[2008-12-13 13:32] 实验九
在最初在debug下修改显存时,就想怎么才能编程实现这个功能。无意中看到了实验九,觉得自己用目前所学的知识能够解决这个问题。所以就试了一哈。这是我最终实现的程序。觉得自己在遇到困难后去思考后,进步了些!!呵呵!!!
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:mov ax,data
mov ds,ax
mov di,0
mov ax,0b872h
mov cx,3
mov sp,30h
s:mov bx,0
mov si,0
mov es,ax
push ax
push cx
mov cx,16
mov ah,[di+10h]
s1:mov al,[bx]
mov es:[si],ax
inc bx
add si,2
loop s1
pop cx
pop ax
add ax,0ah
inc di
loop s
mov ax,4c00h
int 21h
code ends
end start
当然,这个程序不是一下就拿出来的。我是先将问题简化为:在屏幕中间只显示一行绿色的'welcom to masm!'
分析一哈:要让屏幕显示出绿色的'welcom to masm!',只需对相应的显存做修改就ok了。将'welcom to masm'定义放入数据段,用这段内存里的内容去修改相应显存就可以了。根据材料可知,我们是不能直接把'welcom to masm'连续不段放入显存,应依次在相应显存的偶单元地址放入'welcome to masm!'的ascii码值,在奇单元地址中放入属性值。可以这样来实现,用ax来中转,ah放属性植,al中放字符ascii码植。然后在用ax的值去改写显存。用什么方法解决后,就要知道屏幕中间显存地址。25*80 25行,13行为中间行用等差数列公式求出13行起始地址:B8000h+a0h*ch=B8780h。80列占160字节'welcome to masm!'占32字节(16个属性字节应算入)。'welcome to masm!'要在一行的中间显示的话,应从这行的第64地址单元开始。容易算出我们应修改的显存的起始地址:B8780h+40h=B87c0h。因此有了以下程序
assume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0B87ch
mov es,ax
mov bx,0
mov si,0
mov cx,16
mov ah,02
s:mov al,[bx]
mov es:[si],ax
inc bx
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
在此基础上,只需要做修改就能实现实验要求的功能。要显示三个字符串,所以应在外面套上一个3次的循环。将属性值02h,24h,71h也定义在数据段中,将mov ah,02改为mov ah,内存地址的方式来设置每个字符串的属性值。增一行时,地址增加a0h。因此只要在外循环做好响应的设置,很容易就能最终完成了。
[ deepblue 发表于 2008-12-13 16:02 ]
你说的不错,我想按你的思路是能实现的。
但是你的程序我试了一下有问题啊 。
[ qinaode12 发表于 2008-12-14 20:11 ]
程序我都是编译连接运行了的,要是我没有运行成功,我是不会写上去的。呵呵!今天又写了一个简单点的,是用单循环就写的,运行也成功了!代码入下:
assume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0B872h
mov es,ax
mov bx,0
mov si,0
mov cx,16
s:mov al,[bx];思路是每次循环,按列修改
mov ah,02 ;第一次分别写不同颜色显示的3个w
mov es:[si],ax;以此类推
mov ah,24h
mov es:[si+0a0h],ax
mov ah,71h
mov es:[si+140h],ax
inc bx
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
[ qinaode12 发表于 2008-12-14 20:42 ]
主要是换成用列的顺序去修改显存简化了程序!因为每列字符的Ascii码值是相同的,因此可以只对数据段中定义的数据取出一次,就可以分别送给同列三行所在的地址。