当前位置: 代码迷 >> 汇编语言 >> 求高手解答一个有关问题,多谢
  详细解决方案

求高手解答一个有关问题,多谢

热度:7300   发布时间:2013-02-26 00:00:00.0
求高手解答一个问题,谢谢

编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'下面是在百度文库中找的代码,但对于每行的意思和作用不是很理解,有哪位高手能够详解一下,谢谢



start: mov ax,data
  mov ds,ax

  mov ax,0b800h
  mov es,ax ;es初始化为显示缓冲区

  mov si,0
  mov di,10*160+80 ;第十行中间(书上给出的资料一个屏幕共显示25行,每行80个字符即160个字节)
  mov cx,16
  s1: mov al,ds:[si]
  mov ah,00000010B ;绿色
  mov es:[di],ax
  inc si
  inc di
  inc di
  loop s1

  mov si,0 ;初始化源地址寄存器,指向数据段中的源字符串
  mov di,11*160+80 ;第十一行中间
  mov cx,16
  s2: mov al,ds:[si]
  mov ah,00100100B ;绿底红色
  mov es:[di],ax
  inc si
  inc di
  inc di
  loop s2

  mov si,0
  mov di,12*160+80 ;第十二行中间
  mov cx,16
  s3: mov al,ds:[si]
  mov ah,01110001B ;白底蓝色
  mov es:[di],ax
  inc si
  inc di
  inc di
  loop s3

  mov ax,4c00h
  int 21h
code ends
end start

------解决方案--------------------------------------------------------
补充说明: 楼主的程序代码不完整,我已补全.

data 是"数据"段 ,用于存放我们定义的数据,在本程序中是用于存放字符串.

mov ax,data 是把data段的段地址赋值给ax 
mov ds,ax 把data段的段地址赋值给ds ,不允许直接给ds寄存器赋值,所以要借助于 ax

ds:[si] 指向的是 data 段,也就是我们定义的字符串,si的初值为0 ,所以指向第一个字符

es:[di] 指向的是显示缓冲区. 0b800:0 指向的是显示缓冲区的开始 
一行有80列,也就是可以显示80个字符,每个显示位置占用两个字节,第一个字节是字符的ASCII码,第二个字节是颜色值. 第0行的偏移是 0*160,第二行的偏移是 1*160 80个字符*2字节=160字节
  相关解决方案