|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 yxjxdb 于 2021-5-21 15:40 编辑
感谢小甲鱼老师的视频!
- assume cs:code,ss:stack,ds:data
- data segment
- db 'Welcome to masm!'
- db 10000010B,00100100B,01110001B ;8bit颜色属性为:闪烁+R+G+B+高亮+R+G+B
- data ends
- stack segment
- dw 8 dup(0)
- stack ends
- code segment
- start:mov ax,data
- mov ds,ax ;源数据段地址
- mov ax,0b872h ;物理地址0B800H:720H是25行最中间的起始地址,直接写成0B872H:0H用bp偏移(不理解可以看王爽老师P24)
- mov es,ax ;目标数据段地址,显存
- mov bx,0 ;源数据偏移地址
- mov si,0 ;颜色数据源偏移地址,db第二行的三字节数据
- mov di,0 ;颜色数据目标偏移地址
- mov bp,0 ;目标数据行偏移地址
- mov cx,3 ;外循环3次
- s0:push cx ;外循环次数先后入栈3\2\1
- mov cx,10h ;内循环16次,(16个字节)
- s:mov al,[bx]
- mov es:[di+bp],al ;目标地址偶数据位单元0,2,4……写入16个字符的ascii码
- mov al,10h[si] ;读源数据第二行颜色数据
- mov es:[di+bp+1],al ;在ascii后面的奇数位1,3,5……字节单元写入颜色数据
- inc bx ;每次循环递增1(16次取16个ascii码)
- add di,2 ;2个字节单元:ascii+颜色属性
- loop s
- mov di,0 ;s循环后清0
- mov bx,0 ;s循环后清0
- add bp,0a0h ;目标单元偏移160个字节
- inc si ;取源数据的下一个颜色属性
- pop cx ;cx在s循环后为0,所以出栈
- loop s0 ;cx=cx-1
- mov ax,4c00h
- int 21h
- code ends
- end start
复制代码
补充:720H的计算
160x11+(160-16x2)/2=1824(720H)
开始有个疑问栈是否多余?经过测试觉得经过s0循环后栈内数据应该是变化的。敬请指正。
|
|