看书看到一个题目:编写一个子函数,打印8行3列的字符串,数据域已经给出
assume cs:codesg,ds:datasg,ss:stack
datasg segment
db 'Welcome to masm! ',0
datasg ends
stack segment
dw 64 dup(0)
stack ends
codesg segment
start:
mov dh,8 ;行号
mov dl,3 ;列数
mov cl,2 ;绿色
mov ax,datasg
mov ds,ax
mov si,0 ;ds:si指向字符串的首地址
mov ax,stack
mov ss,ax
mov sp,128
call show_str
mov ax,4c00h
int 21h
;打印dh行dl列的字符串
show_str:
mov ax,0b800h
mov es,ax ;es定位显存
mov bx,0 ;真正打印的位置
mov ah,cl ;低位存放颜色
;控制行循环
mov cx,0
mov cl,dh
row:push cx
push bx
;控制列循环
mov cx,0
mov cl,dl
col:push cx
push si
call print ;打印字符串
pop si
pop cx
loop col ;循环打印一行
pop bx
add bx,160 ;定位到下一行打印
pop cx
loop row ;循环打印行
ret ;返回
;打印字符串
print:
mov cl,[si]
mov ch,0
jcxz ok ;判断当前字符是否到0,到了就停止这个打印
mov al,[si]
mov es:[bx],ax ;写入显存显示
inc si
add bx,2
jmp short print ;如果没打印完,就继续往后打印
ok:
ret
codesg ends
end start
绝对不用汇编写程序了。