我正在尝试使用 x86 程序集更改屏幕的背景和前景色,但它不起作用:
mov ax,0
mov al,11101100b
int 10h
ret
据我所知,代码是正确的。难道我做错了什么?我以前尝试过这段代码:
mov ax, 0600h
mov bh, 11110000b
mov cx, 0000h
mov dx, 1010h
int 10h
但它在屏幕一角制作了一个白色的小矩形并覆盖了一些文字。
您首先从ArbitCode尝试的代码运行良好,并且有很好的文档记录。
...矩形出现在文本顶部...
这可能是因为您没有设置正确的窗口大小。默认情况下,视频模式设置为模式 3,即 80x25。
只是为了确保,通过执行以下操作自行设置:
MOV AH,00h ; Set video mode
MOV AL,03h ; Mode 3 (Color text)
INT 10H
我对您之前使用的代码进行了一些更改,我将尝试解释它们:
MOV AX, 0600h ; AH=06(scroll up window), AL=00(entire window)
MOV BH, 00010111b ; left nibble for background (blue), right nibble for foreground (light gray)
MOV CX, 0000h ; CH=00(top), CL=00(left)
MOV DX, 1010h ; DH=19(bottom), DL=50(right)
INT 10h
正如您在上面看到的,DH 和 DL 定义了右下角。我们的窗口大小是 80x25,所以我们必须将 DH 设置为 19h(十进制为 25)和 DL 为 50h(十进制为 80)。
这个问题比较模糊。您是否尝试用单一颜色绘制整个屏幕?
中断 10 没有屏幕当前颜色/背景的概念。它能够输出具有提供的背景和颜色的单个字符(函数 AH=9);如果您按屏幕行和列循环使用它,则可以用颜色填充整个屏幕。
作为记录,在文本模式下,直接读/写帧缓冲区(在 0xb800:0000)比使用中断 10h 容易得多。