如何将颜色属性更改为黑底白字

问题描述 投票:0回答:2

我想使用

ah=09h
在屏幕上写一条消息。但是当我清洁屏幕时,文本属性会将文本更改为黑底黑字。我应该将 cleanscreen 过程更改为哪个值,以便文本可见?

proc cleanscreen ; cleans the screen
    push cx bx
    mov cx,2000d
    mov bx,0
    clean:
        mov [WORD ptr es:bx],00 ; the value that should be changed
        add bx, 2
    loop clean
    pop cx bx
    ret
endp cleanscreen    
DATASEG
message db 'GAME OVER$'

    ...

    call cleanscreen
    mov dx, offset message
    mov ah,9h
    int 21h
assembly x86-16 dos masm tasm
2个回答
0
投票

寄存器保存错误

push cx bx
...
pop cx bx
ret

堆栈是后进先出(LastInFirstOut)结构;最后进入堆栈的内容必须先离开。在您的代码中,

BX
寄存器最后被推送,因此必须首先使用像
pop bx cx
这样的代码来关闭它。
如果您对堆栈还不满意,我建议使用另一种编写方式:

push cx
push bx
...
pop  bx
pop  cx
ret

使用角色属性

您使用的文本屏幕为其显示的每个字符存储 3 条信息。
对于视频存储器中的每个字,低字节将包含字符的ASCII代码,高字节将在低半字节中注册字符的f背景颜色,在高半字节中注册字符的b背景颜色啃咬。

bbbbffffAAAAAAAAh

mov [WORD ptr es:bx],00
这样使用
WORD
标签的指令将清除所有3条信息,产生一个BlackOnBlack空格字符。请注意,书写
00
绝不意味着 byte,书写
0000
也不意味着 word。操作的大小通过提及
byte ptr
word ptr
来定义。

在我对类似问题的回答下面的评论中,您向自己建议了一种在不触及颜色属性的情况下清洁屏幕的方法:

  xor  bx, bx
clean:
  mov  [BYTE ptr es:bx],00  ; Only the ASCII field
  add  bx, 2
  loop clean

为了将屏幕颜色更改为 WhiteOnBlack (07h) 并保留现有文本,我们可以使用:

  mov  bx, 1
clean:
  mov  [BYTE ptr es:bx], 07h  ; Only the attribute field
  add  bx, 2
  loop clean

要将屏幕完全恢复为黑底白字 (0720h),请使用:

  xor  bx, bx
clean:
  mov  [WORD ptr es:bx], 0720h  ; ASCII & attribute fields
  add  bx, 2
  loop clean

对于 BrightWhiteOnBlack 使用 0F20h。


0
投票

在您使用 mov word ptr es:[bx], 0 的地方,最好使用 0f20h ... 0F 表示黑底白字,20h 是空格字符

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.