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