马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 逆风飞翔1992 于 2020-10-15 15:38 编辑 assume cs:codesg,ds:datasg,ss:stack;用栈来存储颜色信息
datasg segment
db 'welcome to masm!' ;文字数据段
datasg ends
stack segment
dw 0002h,0024h,0071h
; 绿色 00000010 2h 绿底红色 00100100 24h 白底蓝色 01110001 71h
stack ends
codesg segment
start:
mov ax,datasg ;获取文字数据位置
mov ds,ax
mov ax,0b872h ;获取屏幕显示位置 显示起始段地址为:B800 屏幕25行80列 (80字符) 中间位置为12,13,14行 起始地址:(160*11+中间位置距离) 字节 = 1760+x
;文字数据段占16字节(8字符) 但由于 文字要配合颜色使用 因此 数据占内存大小需要*2 该段文字占内存 16*2=32字节
;一行共160字节 文字在中间 因此 前方留空的内存大小为 (160-32)/2=64 字节
;1760+64=1824=720h 720h作为偏移地址 段地址应该为72h 因此 B800H+72H 为文字颜色的起始地址
mov es,ax
mov ax,stack
mov ss,ax
mov sp,0 ;把栈顶位置找到 0002h是地址最小,在最上方
mov cx,3
mov si,0 ;si 表示对应的字体 si+1对应颜色
s0:
mov dx,cx
mov bx,0 ;bx 表示welcome to masm
pop di ;直接从栈顶取颜色
mov cx,16
s: mov al,[bx] ;复制文字到屏幕位置
mov es:[si],al
mov ax,di
mov byte ptr es:[si+1],al ;将颜色给地址的高位 通过al来改变颜色
inc bx
add si,2
loop s
add si,80h ;80h的由来 后一行开始的文字比前一行开始 中间相差160个字节(一行为160字节) 160=a0h
;datasg 里的文字和颜色 占据了 16*2=32=20h字节
;因此 下一行开始和上一行的结尾 相差了 a0h-20h=80h个字节
mov cx,dx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
|