汇编语言-显存输出

直接向显存输出

Posted by Kingtous on April 9, 2019

问题简介

向显存中输出字符串(中心输出)

  • 自动检测字符串长度
  • 循环结构

代码

assume cs:code,es:message,ds:message

message segment
    detail db 'Hello My Friend!'
    length db $-0
    bias dw ?
message ends

code segment
  
    start:
       mov ax,0B800H     ;显存初始地址
       mov es,ax         ;将显存地址传入es
       
       mov ax,0 
       mov cx,0BH         ;加12次
       ; 计算行的偏移地址
    movTo12line:
       add ax,0A0H
       loop movTo12line
       ; 传入ds的Message段
       mov si,ax          
       
       mov ax,message
       mov ds,ax           ;把message地址传入ds     
       ;将长度传入cx
       mov di,offset length 
       xor ch,ch
       mov cl,byte ptr ds:[di]
                
       ;计算当前行应该偏移的地址,偏移地址为
       mov ax,50h
       sub al,cl
       mov bl,2
       div bl    
       xor ah,ah
       add si,ax 
      
       mov ax,0
       mov bx,0
       mov dh,01001010B     ;显示模式
       mov di,offset detail ;传入di的偏移
        
       ; es:[si](显存) <- ds:[di](存储)
    print:
       mov dl,byte ds:[di]
       inc di
       mov es:[si][bx],dx
       add bx,2 
       loop print
       
       mov ax,4c00h
       int 21h

end start 
code ends

输出参考

  • 80*25结构

80X25彩色字符模式显示缓冲区的结构:

  在内存地址结构中,B8000H~BFFFFH共32KB的空间,为80x25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在

显示器上。

  在80x25彩色模式下,显示器可以显示25行,每行80个字符,每个字符可以由256中属性。

  80x25模式下,一屏的内容在显示缓冲区共4000个字符。

  • 字符属性
7 6 5 4 3 2 1 0
BL R G B I R G B
闪烁 背景 背景 背景 高亮 前景 前景 前景