|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code
data segment
db 'Wolcome to masm!',0 ;要显示的字符串,结尾为0
data ends
code segment
start: mov dh,24 ;行数8,存入dh中
mov dl,20 ;列数3,存入dl中
mov cl,2 ;要显示的字符串颜色,02H即绿色
mov ax,data
mov ds,ax ;ds寄存器段地址与数据段段地址挂钩
mov si,0 ;数据段偏移地址si,初始值为0,指向数据段第一个位置
call show_str ;调用show_str子程序
mov ax,4c00h ;程序结束
int 21h
;内存地址B8000H~BFFFFH为显示缓冲区的内存范围,分8页,第0页也即显示在显示器中的内容,第0页内存地址为:B8000H~B8F9FH(4000个字节)
;偏移000-09F对应显示器中第1行(80个字符占160个字节)
;偏移0A0-13F对应显示器中第2行
;偏移140-1DF对应显示器中第3行......
;偏移460-4FF对应显示器中第8行
;一行中,00-01对应显示器中第1列,02-03对应显示器中第2列,04-05对应显示器中第3列......
;【推断】:N行的偏移首地址为160字节*N
;【推断】:某行中M列的字节位置为:M*2 — M*2+1
;【推断】:N行M列的地址为:B800:N*160(偏移部分转换为16进制)+ M*2 —— B800:N*160(偏移部分转换为16进制)+ M*2+1
show_str:
push dx
push cx
push ax
push ds
push si
mov ax,0B800h
mov es,ax ;将显示缓冲区段地址放入es中
mov di,0
mov al,160 ;将160(即每行160个字节)放入al中
mul dh ;将N值与160(放在al中)相乘,结果在ax中
mov bx,ax ;将结果放入BX中,因为等下AX还要用到。
mov al,2
mul dl ;进行M*2计算,结果在AX中
add bx,ax ;到此步已经计算出N行M列的偏移地址,将字符串放入[BX]中,将颜色值放入[BX+1]中
mov al,cl ;将颜色值存入al中
show: mov cl,ds:[si]
mov ch,0
jcxz ok
mov es:[bx+di],cl
mov es:[bx+di+1],al
inc si
add di,2
jmp short show
ok: pop si
pop ds
pop ax
pop cx
pop dx
ret
code ends
end start
=====================我是分割线===========================
上面程序经调试能正常运行,结果正确。
上面的程序的基础上,是否还可以再优化,代码优化,执行效率优化,占用空间(寄存器)优化?
请大大传经送宝~~:lol: :lol: :lol: |
|