;显示字符就是往显存里写进要显示的东西。每个字符占显存中两个字节,低字节是字符的ASCII码
;高字节是设置所示字符的属性.每位都定义有显示属性,从高位到低位依次是      
;闪烁   背景红   背景绿   背景蓝   高亮   前景红   前景绿   前景蓝  
  assume   cs:code,ds:data  
  data   segment  
  db   'www.csdn.net',0  
  data   ends  
  code   segment  
      start:mov   ax,data  
  mov   ds,ax  
  mov   si,0  
  mov   ax,0b800h           ;写显存  
  mov   es,ax  
  mov   di,160*12+60     ;显示字符在屏幕上的位置  
              s:mov   al,[si]  
  cmp   al,0                     ;遇到0了显示就终止  
  je   over   
  mov   byte   ptr   es:[di],al          ;把数据段的字符的ASCII码传进显存   
  mov   byte   ptr   es:[di].1,89h    ;这句设定字符显示属性,颜色、背景、闪烁。                                                                               ;属性字节可以不写   
  inc   si  
  add   di,2           ;每个字符占两个字节,所以加2   
  loop   s   
  over:mov   ax,4c00h  
  int   21h  
  code   ends  
  end   start  
===========================================================
mov   di,160*12+60  
第12行第30列,一行80个字符,每个字符2个字节,这样就可以推出一行160字节。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 名称: show_str
; 功能: 指定位置显示字符串
; 参数: dh=行号[0..24]
;       dl=列号[0..79]
;       cl=color
;       ds:si指向字符串首地址
; 返回: 无
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
assume cs:code
data segment
  db 'Welcome to masm',0
data ends

code segment
start:
  mov cl,2
  mov ax,data
  mov ds,ax
  mov si,0
  call show_str
over:
  mov ax,4c00h
  int 21h
show_str:
  mov di,8*160+3*2 ;指向指定的行列
  mov ax,0b800h
  mov es,ax        ;显存地址
s:
  mov ah,BYTE ptr [si]
  cmp ah,0
  je over
  mov BYTE ptr es:[di],ah ;写入字符
  inc di
  mov BYTE ptr es:[di],cl ;写入字符属性
  inc di
  inc si
  jmp short s
code ends
end start
-------------------------------------
这样自己写了按照意思写了一个果然是这样的。