|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码 |
|