问题简介
向显存中输出字符串(中心输出)
- 自动检测字符串长度
- 循环结构
代码
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 |
闪烁 | 背景 | 背景 | 背景 | 高亮 | 前景 | 前景 | 前景 |