;思路是,自动计算出显示字符居中,想显示其它内容,只要在前面修改即可。当然,想修改显示效果,也可以直接在前面修改
assume cs:code
text segment
db 'Welcome to masm!',0
db 00000010b,00100100b,01110001b
;定义绿色、绿底红字、白底蓝字3个属性
text ends
code segment
start:
mov ax,text
mov ds,ax
mov ax,0b800h
mov ss,ax ;初始化
mov bx,0
s:
mov cl,[bx]
mov ch,0h
jcxz onset
inc bx
loop s ;取得要显示的字符个数
onset:
mov ax,0a0h
sub ax,bx
mov di,bx ;保存字符个数到di
mov bl,2h
div bl ;计算出居中排列时字符的起始列地址
mov si,ax ;保存起始列地址至si
mov cx,3
mov ax,25
sub ax,cx
mov bx,2h
div bl ;计算出居中排列时字符的起始行
mov bp,ax ;保存起始行至bp
mov cx,bp
mov bp,0
s0:
add bp,0a0h
loop s0 ;计算起始行地址至bp
mov bx,0
mov cx,3 ;设置显示字符行数
;mov di,0 ;设置字符属性起始地址
s1:
mov dx,cx ;保存外循环次数
mov sp,si ;保存起始列地址
mov cx,di ;设置内循环次数=字符个数
s2:
mov ah,ds:1[di] ;复制字符属性
mov byte ptr 1h[bp][si],ah ;输出字符属性
mov al,[bx] ;复制字符
mov [bp][si],al ;输出显示字符
inc bx
add si,2
loop s2
inc di
add bp,0a0h
mov cx,dx
mov si,sp
mov bx,0
loop s1
mov ax,4c00h
int 21h
code ends
end start |