马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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循环后栈内数据应该是变化的。敬请指正。
|