美文网首页
8086汇编(24)编程:在屏幕中间分别显示绿色、绿底红色、白底

8086汇编(24)编程:在屏幕中间分别显示绿色、绿底红色、白底

作者: 迷心迷 | 来源:发表于2019-04-04 17:48 被阅读0次

    编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'

    80*25彩色字符模式显示缓冲区的结构:

    内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。

    在80*25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256中属性(背景色、前景色、闪烁、高亮等组合信息).

    这样,一个字符在显示缓冲区中就要占两个字节,分别存放字符的ASCLL码和属性。80*25模式下,一屏的内容在显示缓冲区共占4000个字节。

    显示缓冲区分为8页,每页4KB,显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。也就是说通常情况下,B8000H~B8F9FH中的4000个字节的内容将出现在显示器上。

    在一页显示缓冲区中:

    偏移000~09F对应显示器上的第1行(80个字符占160个字节);

    偏移0A0~13F对应显示器上的第2行;

    偏移140~1DF对应显示器上的第3行;

    以此类推,可知偏移F00~F9F对应显示器上的第25行。

    在一行中,一个字符占两个字节的存储空间(一个字),低位字节存储字符的ASCLL码,高位字节存储字符的属性。一行共有80个字符,占160个字节。

    即在一行中:

    00~01单元对应显示器上的第1列;

    02~03单元对应显示器上的第2列;

    04~05单元对应显示器上的第3列;

    依此类推,可知,9E~9F单元对应显示器上的第80列。

    例如:在显示器的0行0列显示黑底绿色的字符串'ABCDEF'

    ('A'的ASCLL码值为41H,02H表示黑底绿色)

    显示缓冲区里的内容为:

    image

    可以看出,在显示缓冲区中,偶地址存放字符,奇地址存放字符的颜色属性。

    一个在屏幕上显示的字符,具有前景(字符色)和背景(底色)两种颜色,字符还可以以高亮度和闪烁的方式显示。前景色、背景色、闪烁、高亮等信息被记录在属性字节中。

    属性字节的格式:

    image

    可以按位设置属性字节,从而配出各种不同的前景色和背景色。

    比如:

    红底绿字,属性字节为:01000010B;

    红底闪烁绿字,属性字节为:11000010B;

    红底高亮绿字,属性字节为:01001010B;

    黑底白字,属性字节为:00000111B;

    白底蓝字,属性字节为:01110001B。

    例如:在显示器的0行0列显示红底高亮闪烁绿色的字符串'ABCDEF'

    (红底高亮闪烁绿色,属性字节为:11001010B, CAH)

    显示缓冲区里的内容为:

    image

    注意:闪烁的效果必须在全屏DOS方式下才能看到。

    assume cs:codesg, ds:datasg, ss:stacksg
      
    datasg segment
            db 'welcome to masm!'
            db 2h,24h,71h                ;三行文字的颜色
    datasg ends
    
    
    stacksg segment stack
            db 16 dup (0)
    stacksg ends
    
    codesg segment
    
    start:
            mov ax,datasg
            mov ds,ax
    
            mov ax,stacksg
            mov ss,ax
            mov sp,16
    
            mov ax,0B872h
            mov es,ax
    
            mov cx,3               ;三行的显示代码是外层循环三次
            mov bx,0               ;记录当前是第几行,也是外层循环的次数
    s:
            push cx
            mov cx,16               ;每行显示16个字符,内存循环16次
    
            mov di,0                ;记录内存循环的次数
    s0:
            mov al,ds:[di]           ;低字节显示文字
            mov ah,ds:[bx+16]        ;高字节显示颜色属性
            mov si,di
            add si,si                ;一个文字占两个字节
            mov es:[si],ax
    
            inc di
            loop s0
    
            pop cx
            mov ax,es
            add ax,00ah               ;切换到下一行的位置
            mov es,ax 
            inc bx
            loop s
    
            mov ax,4c00h
            int 21h
    
    codesg ends
    
    end start
    

    最后在DOS界面运行如下:

    image

    相关文章

      网友评论

          本文标题:8086汇编(24)编程:在屏幕中间分别显示绿色、绿底红色、白底

          本文链接:https://www.haomeiwen.com/subject/hsmqiqtx.html