汇编操作显存

    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

  

原文地址:https://www.cnblogs.com/youxin/p/2512329.html