一、我的编程思想:仔细阅读实验九给的材料得知要在B8000--B8F9F中写入数据,数据包含两个属性:一个是字符颜色 二是写入的字符串内容。
A、字符的颜色如何配置:由设置属性字节配出如下:
a、绿色 00000010B 02H
b、绿底红字 00100100B 24H
c、白底蓝色 01110001B 71H
B、算出屏幕中间所放字符串(带颜色属性)的偏移地址 (段地址:B800H)
因为一屏显示25行,每行160个字节 那么中间三行就是:12行、13行、14行,又因为字符在每行的中间,则可得出每串字符的首偏移地址为:720H、7C0H、860H
知道了这么多那么编程就好办了,编程如下:
——————————————————————————————————————
assume cs:codesg
data segment
db'welcome to masm!' ;定义显示的字符串
data ends
stacksg segment
dw 02h,24h,71h,0 ;定义颜色值,后面还将此做为栈使用 我这样做不知道会不会有问题?
stacksg ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov ax,stacksg
mov ss,ax
mov sp,8h
mov cx,3h
mov bp,0
s0:push cx ;保护外循环进栈
mov cx,10h ;设置内循环16次
mov si,0
mov di,0
s: mov al,ds:[di] ;取出字符放在al中
mov ah,ss:[bp] ;颜色值直接赋值到ah中
mov es:[si+720h+bx],ax ;将ax值存到08b00h:720h内存单元处,让字符在屏幕的第12行中间显示出来
add si,2
inc di
loop s
add bp,2
add bx,0a0h ;换到下一行
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
-----------------------------------------------------------
调试通过了 ,但中间提出的问题希望有人能帮我解解,那个段总感觉有点不对劲 呵呵 |