assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!' ;定义要显示的字符串
db 02h,24h,71h ;定义三种颜色属性
; 7 6 5 4 3 2 1 0
;颜色属性:BL R G B I R G B
; 闪 背景 亮 前景
;比如红底绿字,属性字节为:01000010B
; 红底闪烁绿字,属性字节为:11000010B
; 红底高亮绿字,属性字节为:01001010B
; 黑底白字,属性字节为:00000111B
; 白底蓝字,属性字节为:01110001B
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 10H
xor bx, bx ;bx清零,用来索引颜色
mov ax, 0b872H ;算出屏幕第12行中间的显存的段起始位置放入ax中
mov cx, 3 ;s3循环控制行数,外循环为3次,因为要显示三个字符串
s3: push cx
push ax
push bx ;三个进栈操作为外循环s3保存相关寄存器的值
mov es, ax ;此时es为屏幕第12行中间的显存的段起始位置
mov si, 0 ;si用来索引代码列的字符
mov di, 0 ;di用来定位目标列
mov cx, 10H
;s1循环控制存放的字符,内循环为10H次,因为一个字符串中含10H个字节
s1: mov al, ds:[si]
mov es:[di], al
inc si
add di, 2
loop s1 ;此循环实现偶地址中存放字符
mov di, 1 ;di的值设为1,从而为在显存奇数地址中存放字符的颜色属性做准备
pop bx
mov al, ds:10H[bx] ;取颜色属性
inc bx
mov cx, 10H ;第二个内循环也为10H次
s2: mov es:[di], al
add di, 2
loop s2 ;此循环实现奇地址中存放字符的颜色属性
;以下4句为下一趟外循环做准备
pop ax
add ax, 0AH ;将显存的段起始地址设为当前行的下一行
;在段地址中加0aH,相当于在偏移地址中加了0A0H(=160d)
pop cx
loop s3
mov ax, 4c00H
int 21H
code ends
end start
Display the same string in different colors in assembly language
Guess you like
Origin blog.csdn.net/qq_43071318/article/details/105425858
Recommended
Ranking