编程:在屏幕中间显示绿色,绿底红色,白底蓝色的字符串’welcome to masm!’
在DOS中有一个80*25的彩色字符模式缓冲区,即25行,每行有80个字符,总计4000个字符,内存地址为B8000H~BFFFF。在这个区域上写入的数据会立刻出现在显示器上。
用e指令定位 B800:0200的内存地址,写入一个41.可以在屏幕的上方看到一个A字符,41其实是ASCII码,41正好对应A字母;
然后我们在紧接着输入 02 数字 ,可以看到字母变成了绿色的;
本题要求的其颜色:
绿色: 00000010B
绿底红色:00100100B
白底蓝色:01110001B
assume cs:codedata segment ;数据段db 'welcome to masm!' ;保存字符串db 00000010B,00100100B,01110001B ;保存三种颜色形式
data endsstack segment ;栈段db 128 dup(0)
stack ends code segment
start: ;在此编写代码mov ax,4c00Hint 21h
code ends
end start
1.创建段: 首先ds和ss的创建,用es来控制打印到屏幕上的位置,在B8000~BFFFFh之间的内存单元,
2. 确定偏移地址:si和di分别控制数据段中字符串和属性的偏移地址,bx控制输出到屏幕上的偏移地址,用dx寄存器来保存数据及格式,注意:高字节(dh)存放属性,低字节(dl)存放数据
3. 开始一次循环:循环16次,首先dl读取8位数据,dx送到es寄存器(直接显示在屏幕上),一个字符输出完成,随后字符递增,输出位置更新,开始下一次打印。
assume cs:codedata segment ;数据段db 'welcome to masm!' ;保存字符串db 00000010B,00100100B,01110001B ;保存三种颜色形式
data endsstack segment ;栈段db 128 dup(0)
stack ends code segment
start: mov ax,datamov ds,ax ;ds指向数据段mov ax,stackmov ss,axmov sp,128 ;创建栈段mov ax,0B800Hmov es,ax ;es控
制打印的屏幕mov si,0 ;si控制字符串数据的起始位置mov di,0010h ;di控制颜色属性的起始位置mov bx,160*10+30*2 ;bx控制打印在屏幕上的位置mov cx,16 ;一次打印循环次数mov dh,ds:[di] ;高位字节存放属性,dh八位寄存器存放颜色属性s: mov dl,ds:[si] ;低位字节存放数据,dl八位寄存器存放数据mov es:[bx],dx ;dx16位寄存器存放了数据和属性,送到屏幕上 inc si ;字符数据移动add bx,2 ;一个字符打印在屏幕上占两个字节,要加2loop smov ax,4c00Hint 21h
code ends
end start
显示:
至此,我们已经完成了第一个字符串的形式的打印,还剩下两个,我们很容易的想到,再来两个循环,再打印两遍字符串。
这确实是一个办法,但是当我们打印完一个字符串后,在打印第二遍,你可以想到,其中有很多变量不一定需要改变,比如控制字符串位置的si,重复的操作只会让程序更加复杂,我们可以使用栈,来实现打印多个。
assume cs:codedata segment ;数据段db 'welcome to masm!' ;保存字符串db 00000010B,00100100B,01110001B ;保存三种颜色形式
data endsstack segment ;栈段db 128 dup(0)
stack ends code segment
start: mov ax,datamov ds,ax ;ds指向数据段mov ax,stackmov ss,axmov sp,128 ;创建栈段mov ax,0B800Hmov es,ax ;es控制打印的屏幕mov si,0 ;si控制字符串数据的起始位置mov di,0010h ;di控制颜色属性的起始位置mov bx,160*10+30*2 ;bx控制打印在屏幕上的位置mov cx,3;入栈,保存每个变量 s0: push di push sipush cxpush bxmov cx,16 ;一次打印循环次数mov dh,ds:[di] ;高位字节存放属性,dh八位寄存器存放颜色属性s: mov dl,ds:[si] ;低位字节存放数据,dl八位寄存器存放数据mov es:[bx],dx ;dx16位寄存器存放了数据和属性,送到屏幕上 inc si ;字符数据移动add bx,2 ;一个字符打印在屏幕上占两个字节,要加2loop s;注意出栈顺序,相反pop bxpop cxpop sipop di add bx,160 ;屏幕的打印位置换行,加160,因为一行有160个字节inc di ;颜色属性递增,实现换色loop s0mov ax,4c00Hint 21h
code ends
end start
本文发布于:2024-02-01 22:13:15,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170679679439758.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |