因为是自动算的行列偏移,所以相对来说修改也比较容易吧。
用的双循环,以下是程序:
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 00000010b, 00100100b, 01110001b
data ends
stack segment stack ;消除MASM编译时的警告
db 16 dup(0)
stack ends
code segment
start: mov ax,data ;初始化
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov ax,0b800h ;基地址
mov es,ax
mov ax,160 ;80字符每屏
sub ax,32 ;输出字符串长度16
mov dl,2
div dl ;(80-16)/2
mov ah,0 ;取整
push ax
mov bx,ax ;相对于基地址的偏移存入bx
mov ax,25 ;25行每屏
sub ax,3 ;共3行
mov dl,2
div dl ;(25-3)/2
mov ah,0 ;取整
mov cx,ax
cpos: add bx,0a0h ;增加al行的偏移至bx中:行&列居中位置,0a0h为一行的偏移量
loop cpos
mov cx,3 ;循环
mov di,0 ;di:颜色索引
lp0: push bx ;记录起始偏移位置
push cx ;记录主循环
mov cx,16 ;次循环
mov si,0 ;si:字符索引
lp1: mov al,[si] ;取得字符
mov ah,10h[di] ;取得颜色
mov es:[bx],ax ;写入
inc si ;下一字符
add bx,2 ;下一地址
loop lp1
pop cx ;恢复主循环次数
pop bx ;恢复为当前行偏移
add bx,0a0h ;增加为下一行偏移
inc di ;下一颜色
loop lp0
mov ax,4c00h
int 21h
code ends
end start |