概述
问题1
在屏幕中间分别显示绿底,绿底红色,白底蓝色的字符串“Welcome to masm!”
分析:
1 如何确定字符要显示的位置
在80*25的彩色字符模式显示缓冲区在内存地址的B8000H~BFFFFH共32KB的空间中
在该模式下,显示器可以显示25行,80列
所以在一行中就有80个字符,共占据160个字节,每个字符低位字节存储字符的ASCII码,高位字节存储字符的颜色属性
偏移0000~009F对应的就是显示器上的第一行;
偏移0A00~13F0对应的就是显示器上的第二行;......依次类推
确定3行字符在每一行的起始位置
因为显示的在屏幕的中间,共需要32个字节,屏幕中一行共160个字节,所以开始字节为(160 - 32)/ 2 = 64
确定3行字符在屏幕中的哪一行
因为屏幕中一共25行,要显示3行字符串,一行有160个字符串,则第一行的开始位置是(25 - 3)/ 2 * 160 = 6E0H
第二行的开始位置是6E0H + 160 = 780H
第三行的开始位置是780H + 160 = 820H
2 如何确定字符要显示的颜色属性
每个字符的颜色属性占据一个字节,每一位表示的不同的颜色属性,则共有256种颜色属性
属性字节的格式:
7 (6 5 4) 3 (2 1 0)
BL (R G B) I (R G B)
闪烁 背景 高亮 前景
绿底黑色:0 010 0 000B (20H)
绿底红色:0 010 0 100B (42H)
白底蓝色:0 111 0 001B (71H)
assume cs:code,ds:data data segment db 'Welcome to masm!' data ends code segment start: mov ax,data mov ds,ax mov bx,0 ;ds:bx指向数据段起始位置 mov ax,0B800H mov es,ax ;设置显示内存空间的起始位置 mov si,64 ;设置字符串在一行中的中间位置 mov cx,16 ;设置循环的次数为字符串的长度 s: mov al,ds:[bx] mov ah,20H ;设置第一行的开始位置和颜色 mov es:[si+6E0H],ax mov ah,42h ;设置第二行的开始位置和颜色 mov es:[si+780H],ax mov ah,71h ;设置第三行的开始位置和颜色 mov es:[si+820H],ax inc bx ;设置字符串的偏移 add si,2 ;设置下一次循环的写入位置 loop s mov ax,4c00h int 21h code ends end start
问题2:
设计一个子程序,使调用者决定显示的位置,内容和颜色
分析:
要实现的功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
指定的参数:行号-dh(取值范围0~24),列号-dl(取值范围0~79),取值范围主要是根据显示器屏幕的大小
颜色-cl,ds:si指向字符串的首地址
assume cs:code,ds:data data segment db 'Welcome to masm!',0 data ends code segment start: mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 ;ds:si指向数据段首地址 call show_str mov ax,4c00h int 21h show_str: mov ax,0B800H mov es,ax ;es指向显示内存空间的段地址 mov ax,160 dec dh mul dh mov dh,0 dec dl add dl,dl add ax,dx mov di,ax ;设置di指向字符串要显示的偏移地址 mov ah,cl show: mov cx,ds:[si] jcxz ok ;设置在遇到字符0的时候退出 mov al,ds:[si] mov es:[di],ax add di,2 inc si loop show ok: retf code ends end start
以上就是汇编语言显示功能实现问题实例详解的详细内容,更多关于汇编语言显示功能的资料请关注靠谱客其它相关文章!
最后
以上就是典雅爆米花为你收集整理的汇编语言显示功能实现教程详解的全部内容,希望文章能够帮你解决汇编语言显示功能实现教程详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复