在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串"welcome to masm!"
屏幕为80*25,故中间为12,13,14行中的65字节(40h)至96字节处
计算第12行起始为6e0h (11*160=1760/16=110%0 110/16=6%14 即为6e0h)
第13行起始为6e0h+0a0h=780h (160/16=10%0 即0a0h)
第14行起始为780h+0a0h=820h
绿色 00000010b=2h
绿底红色 00100100b=24h
白底蓝色 01110001b=71h
思考:需要将"welcome to masm!" 填入目标地址,在其中间加入颜色属性。
程序过程:
1.将字符串存入数据段
2.将颜色属性存入数据段
3.12行数据存入目标地址
4.12行颜色属性存入目标地址,循环16次
5.13行……
6.14行……
7.终止
初步编程:
assume cs:code,ds:data
data segment
db 'welcome to masm!' ;字符串,颜色属性
db 2h,24h,71h
data ends
code segment
start:
mov ax,data ;ds指向data
mov ds,ax
mov ax,0b800h ;es指向显存0页
mov es,ax
mov di,0
mov si,10h ;si为颜色属性地址
mov cx,3 ;3行,循环3次
s1: mov dx,cx ;2重循环,cx转存
mov bx,0
mov cx,16 ;字符串为16字节,循环16次
mov bp,06e0h ;06e0h为12行起始
s0: mov al,[bx]
mov es:[bp+di+40h],al ;+40h即第65字节处
mov ah,[si]
mov es:[bp+di+41h],ah ;颜色属性存入高位字节
add bp,2 ;bp+2,因为ASCII码+颜色属性为1个字
inc bx
loop s0
inc si
add di,0a0h ;di用作换行,1行160字节,即0a0h
mov cx,dx
loop s1
mov ax,4c00h
int 21h
code ends
end start
调试通过
最后想请问个问题,这个程序没有用到栈,所以我想把es改成ss,后面bp不用指明段地址了,编译连接通过,但是运行出错,何解? |