/* 编程: 在屏幕中间分别显示 绿色、绿底红色、白底蓝色 的字符串 ‘welcome to masm!’
- 数据的组织
- 数据的处理 一个字符在屏幕上占用2个字节 低地址存放字符的ASCⅡ码 高地址存放字符的属性
*/
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!' //ds:[si]
db 00000010B //绿色 //0000 0000
db 00100100B //绿底红色 // rgb rgb
db 01110001B //白底蓝色
db 'xxxxxxxxxxxxxxxx'
data ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
//逻辑上的切割 call指令
call init_reg
//显示第一段字节
/*==========================================================================================/
//公共部分,参数 只修改si 与 di 即可
mov si,0 //字符串(内容)的起始地址
mov di,16010 + 2*30 //字符在屏幕上的显示位置 第10行30列(67C) 偶数地址
mov bx,16 //属性的起始地址
mov dx,0 //存放字符属性
call show_masm
//显示第二段字节
/*==========================================================================================*/
mov si,19 //字符串(内容)的起始地址
mov di,160*15 + 2*30 //字符在屏幕上的显示位置 第10行30列(67C) 偶数地址
mov bx,16 //属性的起始地址
mov dx,0 //存放字符属性
call show_masm
/*==========================================================================================*/
mov ax,4c00h
int 21h
//显示内容
/*==========================================================================================*/
show_masm: mov cx,3
s0: push bx
push cx
push si
push di
mov cx,16
mov dh,ds:[bx] // mov es:[di],dx es:[di+0],dl ASCⅡ码 es:[di+1],dh 字符属性
s: mov dl,ds:[si]
mov es:[di],dl
add di,2
inc si
loop s
pop di
pop si
pop cx
pop bx
add di,160
inc bx //改变一个字节,切换下一个属性
loop s0
ret
//显示内容
/*==========================================================================================*/
init_reg: mov bx,data //数据从哪里来
mov ds,bx
mov bx,0B800h //数据到哪里去
mov es,bx
ret
code ends
end start