使用x86 Assembly更改背景和前景色

时间:2013-10-18 08:22:54

标签: assembly x86 dos x86-16 qemu

我正在尝试使用x86程序集更改屏幕的背景和前景色但不起作用:

mov ax,0
mov al,11101100b
int 10h
ret

据我所知,代码是正确的。难道我做错了什么?我之前尝试过这段代码:

mov ax, 0600h
mov bh, 11110000b
mov cx, 0000h
mov dx, 1010h
int 10h

但它在屏幕的一角做了一个小的白色矩形,并覆盖了一些文字。

2 个答案:

答案 0 :(得分:0)

这个问题很模糊。您是否尝试使用单一颜色绘制整个屏幕?

中断10没有屏幕当前颜色/背景的概念。它能够输出具有提供的背景和颜色的单个角色(功能AH = 9);如果你在屏幕行和列的循环中使用它,你可以用一种颜色填充整个屏幕。

对于记录,在文本模式下,直接读取/写入帧缓冲(在0xb800:0000)比使用中断10h更容易。

答案 1 :(得分:0)

您首先从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)。

相关问题