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

我的博客

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

[2008-12-13 13:32] 实验九

因为一直都想,在cmd下运行程序后,能看到一点东西。
在最初在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。因此只要在外循环做好响应的设置,很容易就能最终完成了。
评论次数(3)  |  浏览次数(509)  |  类型(默认类型) |  收藏此文  | 

[  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码值是相同的,因此可以只对数据段中定义的数据取出一次,就可以分别送给同列三行所在的地址。

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