汇编语言实验九
编程:在屏幕中间显示绿色字符串‘welcome to masm!’
分析:
在内存地址空间中,B8000H ~ BFFFFH(共32KB)的空间,为 86x25 彩色字符模式的显示缓冲区。
向这段地址空间写入的数据内容,将立即出现在显示器上。
在 86x25 彩色字符模式下,显示器可以显示 25 行。每行能显示 80 个字符。
不同于其它内存空间的数据,在显存地址空间中,一个字符信息需要 2 个字节长度来存放。因为在显存中的一个字符信息,不仅包括字符本身,还有字符的前景色、背景色、闪烁、高亮等组合信息,这些信息需要 8 bit 空间来存储。
所以拥有 32KB 容量的显示缓冲区,一共能存放 16 × 1024 个字符。
综上:显示器一个屏幕整 = 2000 个字符显示 = 显示缓冲器 4000 个字节 = 显示缓冲区 1 页的字节数
即显示缓冲区分为 8 页,但是通常情况下,显示第 0 页的内容,即 B8000H ~ B8F9FH 这段内存地址空间将出现在显示器上。
在显示缓冲区中,偶地址存放字符,基地址存放字符的颜色属性。
代码:
# 分析: # 仔细阅读编程要求,我们不难发现,它无非是要求我们:在屏幕上显示字符串,具体涉及两点: # 1)在什么位置显示 # 2)显示的字符串的属性是什么 # # # 实现: # 首先,我们根据材料找到屏幕中间的位置是:段地址:B800h 偏移地址:160*12+30*2 , 以及绿色的属性字节:02h、24h、71h # # 然后我们先注意两点: # 1)对屏幕操作,实际上是对显存缓冲区进行操作,与前面对内存的操作的一样的,要显示字符,我们只要往显存中写入字符数据就可以了 # 2)在显存缓冲区中,偶地址存放字符,奇地址存放颜色属性 # # 7 6 5 4 3 2 1 0 # BL R G B I R G B # 高亮 前景色 闪烁 背景色 # # 显示 welcome to masm! # 原本 16 字节, 但是由于要显示在显示上, 所以需要 32 字节来存储 assume cs:code,ds:data data segment db 'welcome to masm!' data ends code segment start: mov ax,data mov ds,ax mov si,0 mov ax,0b800h ; 汇编语言中数据不能以字母开头 mov es,ax mov di,160*12+30*2 ; 在显示缓冲区第一页, 第一个字符的偏移单元(字节)数 mov cx,16 next: mov al,[si] mov es:[di],al ; 先向目的地址的低字节空间移动字符本身, 以 al 寄存器做中转 mov byte ptr es:[di+1],02h ; 再向目的地址的高字节空间移动字符的显示属性 inc si add di,2 loop next mov ah,4ch int 21h code ends end start