汇编操作显存
2012-05-21 22:50 youxin 阅读(3014) 评论(0) 编辑 收藏 举报80*25彩色字符模式显示缓冲区(以下简称显示缓冲区)的结构:
内存地址中,b8000h-bffffh共32kb空间,为80*25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容会立即出现在显示器上。
在80*25模式下,显示器可以显示25行,每行显示80个字符,每个字符有256中属性(背景色,前景色等)。这样,一个字符在显示缓冲区就要占2个字节,分别存字符的ascii码和属性。在80*25下,一屏的内容在显示缓冲区中共占4000个字节。
显示缓冲区分为8页,每页4kb(约等于4000b),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容,也就是说通常情况下,b8000h~b8f9fh中的4000个字节的内容将出现在显示器上。
在一页显示缓冲区中:
偏移000~09f 对应显示器上的第一行(80个字符占160个字节)
偏移0a0~13f对应显示器上的第二行
依此类推,可以知道,偏移f00~f9f对应显示器上的第25行
在一行中,一个字符占2个字节,低位字节存储字符的ascii,高位存储字符的属性。一行共有80个字符,占160个字节。
00~01 单元对应显示器上的第1列
02~03 单元对应显示器上的第2列
04~05 单元对应显示器上的第3列
可以看出,在显示缓冲区里,偶地址存储字符,奇地址存储字符的属性。
属性字节的格式:
7 6 5 4 3 2 1 0
BL7闪烁 rgb背景(654)I(高亮3) rgb(前景色 210)
可以按位设置属性字节,从而配出各种不同的前景色和背景色。
在emu8086下遇到问题:mov byte ptr al,[si]
编译错误:第一个操作数未定义
改成 al,[si]没问题
但是在masmplus 下 mov BYTE ptr al,[si]
这段程序是没问题的。
在emu8086下
mov byte ptr al,[si] 有问题
mov byte ptr es:[di],al 没问题
让程序暂停:
mov ah, 0
int 16h
这是键盘输入中断,相当于按任意键继续。
题目:屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm!’
assume ds:data,cs:code data segment db 'welcome to masm!' data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov si,0 mov di,10*160+80 ;第十行中间 mov cx,16 s1: mov al,ds:[si] mov ah,00000010B ;绿色 mov es:[di],ax inc si inc di inc di loop s1 mov si,0 mov di,11*160+80 ;第十一行中间 mov cx,16 s2: mov al,ds:[si] mov ah,00100100B ;绿底红色 mov es:[di],ax inc si inc di inc di loop s2 mov si,0 mov di,12*160+80 ;第十二行中间 mov cx,16 s3: mov al,ds:[si] mov ah,01110001B ;白底蓝色 mov es:[di],ax inc si inc di inc di loop s3 mov ax,4c00h int 21h ;如果要看到完整的显示请输入:“-g 4c”,即立即运行到此条指令 code ends end start
-g命令是运行程序命令
G;从CS:IP指向的指令开始执行程序,直到程序结束或遇到INT 3。
G 断点1[,断点2,…断点10];从CS:IP指向的指令开始执行程序,直到遇到断点。
-g 4c 运行到语句mov ax,4c00h,下一条语句为int 21h