汇编语言实验九

时间:2022-04-13 01:11:31

编程:在屏幕中间显示绿色字符串‘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