以"中间"为切入点,实现实验9的汇编程序
最近有点无聊,迷上了王爽的<<汇编程序>>,发现这本教程还是挺通俗易懂的.偶目前的进度已完成了第九章的检测题与编程.论坛里也看了其他会员的源代码,单就从代码行数来看,发现写得都挺烦琐,当然,编程者出发点不一样,实现程序效果的方法千万种,最终实现的效果都是一样的,也各有优缺点.这里就我目前所学到的汇编知识,与大家分享对实验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.最终显示效果图示:
最近评论