lab92002.3.6

编程,在屏幕中间分别显示绿色, 绿底红色, 白底蓝色的字符串 ‘welcome to masm !’

材料分析:

内存 B8000H ~ BFFFFH共 32KB 的空间 , 为 80 X25 彩色字符模式显示缓冲区. 向这个地址空间写入数据, 写入的内容会出现在显示器上

这种模式下, 可以显示 25行 *80 个字符 . 每个字符有 256种 属性 (那就是用一个字节来控制它的各种显示属性喽)

显示缓冲区分为 8 页 ,每页 4kb , 显示器可以显示任意一页的内容.
默认情况下显示第一页, 也就是 B8000H ~ B8F9FH 中的4000个字节

偏移 000 ~ 09F 对应显示器第一行(80个字符160字节)
0A0 ~ 13F 对应显示器上的第2行
140~1DF对应第三行

在一行中,一个字符占两个字节, 低位字节存储ASCII, 高位字节存储字符的属性

  1. assume cs:code
  2. data segment
  3. db "welcome to masm!"
  4. db 00000010b
  5. db 00100100b
  6. db 01110001b
  7. data ends
  8. code segment
  9. start: mov bx,data
  10. mov ds,bx
  11. mov bx,0b800h
  12. mov es,bx
  13. mov si,0 ;si用来指向字符
  14. mov di,160*10 + 30*2 ;di用来指那块要设置的区域
  15. mov bx,16 ;bx指向设置的颜色
  16. mov dx,0
  17. mov cx,3
  18. showColumn:
  19. push bx
  20. push cx
  21. push si
  22. push di
  23. mov cx,16
  24. mov dh,ds:[bx]
  25. showRow:
  26. mov dl,ds:[si]
  27. mov es:[di],dx
  28. add di,2
  29. inc si
  30. loop showRow
  31. pop di
  32. pop si
  33. pop cx
  34. pop bx
  35. add di,160
  36. inc bx
  37. loop showColumn
  38. mov ax,4c00h
  39. int 21h
  40. code ends
  41. end start

最后也算是千辛万苦
image.png
可以看出来, 我对汇编编程太弱了
各个寄存器使用的情况, 数据处理的常用手段, 完全不熟悉