首页 > 技术农场 > 以"中间"为切入点,实现实验9的汇编程序

以"中间"为切入点,实现实验9的汇编程序

2009年11月23日 batman   1,884 Views

最近有点无聊,迷上了王爽的<<汇编程序>>,发现这本教程还是挺通俗易懂的.偶目前的进度已完成了第九章的检测题与编程.论坛里也看了其他会员的源代码,单就从代码行数来看,发现写得都挺烦琐,当然,编程者出发点不一样,实现程序效果的方法千万种,最终实现的效果都是一样的,也各有优缺点.这里就我目前所学到的汇编知识,与大家分享对实验9的分析过程.希望大家能对当中的错误指正,本文没什么技术含量,请高手飘过.谢谢!

编程题目:在屏幕(80*25彩色字符模式)中间分别显示绿色、绿底红色、白底蓝色的字

符串“welcome to masm!”。

对编程题目的理解:

首次看到这个编程题时,我首先想到的是:这个屏幕中间所指的到底是一个什么位置?

我的切入点就是这个“中间”位置。
在80*25彩色字符模式下,我所整理出来的屏幕“中间”过程如下:

80*25彩色字符模式   一屏25行  80个字符(一个字符占两个字节80*2=160,其中一

个字节是字符的ASCII码,一个字节是字符的属性,ASCII码在低位,属性字节在高位。)

题目给的 welcome to masm!  一共16个字符(空格也是一种字符),则在内存中要用

16*2=32个字节来存放。

所以,列的“中间”则开始于(160-32)/2=64,即从64+1=65开始,一直至65+31=96

 

      行的“中间”则开始于(25-3)/2=11,即从11+1=12开始,   一直至12+2=14

所以这个屏幕中间区域应为:12行-14行的65列至96列

80*25彩色字符模式显示缓存区:B8000H–BFFFFH (共32KB)

80*25彩色字符模式段地址: B800H

1.题目要求的“中间”偏移地址计算:

12行 中间偏移地址                                                        

12*160(12行的末地址)-160=1760(12行的首地址)=06E0H 

则12行中间起始地址为:06E0+40=0720H 0720H————–073FH

B800:0720–B800:073F  要写 绿色(00000010=02H)  welcome to masm!

 

13行 中间偏移地址

13*160(13行的末地址)-160=1920(13行的首地址)=0780H 

则13行中间起始地址为:0780+40=07C0H                       07C0H—————07DFH

B800:07C0–B800:07DF  要写 绿底红色(00100100=24H) welcome to masm!

 

14行 中间偏移地址

14*160(14行的末地址)-160=2080(14行的首地址)=0820H 

则14行中间起始地址为:0820+40=0860H                       0860H—————087FH

B800:0860–B800:087F  要写 白底蓝色(01110001=71H)welcome to masm!

 

2.如何实现向这个屏幕“中间”区域写屏?

a.因三行显示的内容都是一样的,所以三行都循环16次即可,用一个循环;
b.三行显示内容的位置不一致,所以用三个不同的寄存器(ax,bx,bp)来存放字符起始位

置;
c.向数据区段取字符时,要取16次,也要用到一个寄存器来存放次数(si),而且每取一次

,si加1;
d.在数据区取完数据向目标区域(显存区域)复制内容后,要将三个寄存器的数值加2(因

为一个字符占用2字节).

3.最终程序如下:

assume cs:code,ds:data
data segment
    db ‘welcome to masm!’
data ends
code segment
    start:mov ax,data
            mov ds,ax
            mov ax,0b800h
            mov es,ax
            mov bp,0720h
            mov bx,07c0h
            mov di,0860h            
            mov si,0h
            mov cx,16
         s:mov al,[si]
            mov ah,02h
            mov es:[bp],ax
            mov ah,24h
            mov es:[bx],ax
            mov ah,0F1h
            mov es:[di],ax
            inc si
            add bp,2
            add bx,2
            add di,2
            loop s

            mov ax,4c00h
            int 21h
code ends
end start

4.最终显示效果图示:

welcome

分类: 技术农场 标签:
本文的评论功能被关闭了.
wow power leveling wow gold cheap wow power leveling aion gold massage shanghai