王爽 汇编 实验9 根据材料编程

一、实验要求:  在屏幕中间分别显示绿色、红底绿色、白底蓝色的welcome to masm!

属性字节格式:

      7    6    5  4  3  2  1  0

含义:   BL  R  G  B  I  R  G  B  

      闪烁   背景色     高亮  背景色

R:红色

G:绿色

B:蓝色

绿色:0x03

红底绿色:0x24

白底蓝色:0x71  

分析:屏幕中间的位置(第一行文字显示的位置):段地址:偏移地址=B800:0760

二、代码实现

assume cs:code,ds:data,ss:stack

data segment
    db 'welcome to masm!'
    db 2,24h,71h    ;三个颜色对应的16进制代码
data ends

stack segment
    dw 8 dup(0)
stack ends

code segment
        ;初始化栈段
start:  mov ax,stack
        mov ss,ax
        mov sp,10h
        
        ;初始化数据段
        mov ax,data
        mov ds,ax
        
        ;初始化显存段
        mov ax,0b800h
        mov es,ax
        
        
        mov bx,780h        ;要显示第一行的起始地址(25行的中间一行的开始位置即第12行的开始位置,12*160=1920=780h)
        mov si,10h         ;定义颜色属性的偏移地址
        
        
        mov cx,3
        ;外层循环处理显示三行数据
s1:     mov ah,ds:[si]
        push cx            ;保存循环次数
        push si            ;保存颜色属性的偏移地址      
        
        mov cx,16          ;循环处理要显示的16个字符串
        mov si,64          ;要显示的数据相对于这一行的偏移地址(字符串居中的位置)
        mov di,0           ;数据段数据列的偏移量

        ;处理每一行要显示的数据
s2:     mov al,ds:[di]       ;数据段中的数据存储到ax低位寄存器
        mov es:[bx+si],al     ;ax低位寄存器数据赋值到es段的偏移地址的单元中
        mov es:[bx+si+1],ah    ;传递颜色属性

        inc di               ;data段字符的偏移量,每次加 1 
        add si,2            ;显示缓存区字符ASCII码偏移量为2    
        
        loop s2
        
        pop si
        pop cx
        
        ;准备下一行要显示的数据地址
        inc si            ;指向下一个颜色
        add bx,0a0h          ;指向下一行(长度160=a0)
        
        
        loop s1        

        mov ax,4c00h
        int 21h
code ends
end start

三、上机调试

待续

参考链接:https://www.cnblogs.com/nojacky/p/9497704.html        

posted @ 2020-03-30 11:24  Tony.Jia  阅读(270)  评论(0)    收藏  举报