Изменить цвет фона Assembler
Необходимо изменить цвет фона на жёлтый, как это сделать?
.486
model small
Code SEGMENT use16
ASSUME cs:Code, ds:Code
org 100h
start:
push cs
pop ds
mov ax, 0b800h
mov es, ax
xor ax, ax
mov di, ax
mov cx, 2000
rep stosw
mov di, 1670
mov ah, 0Ch ;Как изменить фон на жёлтый?
lea si, mess
mov cx, 12
next0:
lodsb
stosw
loop next0
next1:
in al, 60h
cmp al, 1
jne next1
int 13h
mess db "Hello world!", 0
Code ENDS
end start
Ответы (2 шт):
Перед тем как задавать атрибуты текста и фона прямой записью в видеобуфер
0xB800, нужно установить соответствующий видеорежим - обычно это 80х25/16, чем занимаетсяINT-10h: AH=0, AL=3(или просто АХ=3). Этого требует счётчик в регистреCXпри заполнении в/буфера.Сам буфер в текстовом режиме(3) организован в виде "2 байта на каждый из 80*25=2000 символов" - в старшем байте лежит атрибут, а в младшем непосредственно код символа. При этом атрибут делится на две тетрады - в старшей цвет фона (для жёлтого
=0хЕ), а в мл.тетраде цвет текста. То-есть, чтобы определить чёрный символ на жёлтом фоне, нужно установить0xE020, где 20h это второй байт со-значением "пробел". Вот пример на FASM'e:
org 0x100
jmp start
mess db 13,10,' Hello World! $'
start:
;// Ставим видео-моду 80х25/16
mov ax,3
int 0x10
;// Забиваем видео-буфер нужными атрибутами
push 0xb800
pop es
xor di,di ;// ES:DI = указатель на в/буфер (приёмник для stosw)
mov cx,80*25 ;// кол-во символов в буфере
mov ax,0xE020 ;// атрибут = цвет фона(Е), цвет текста(0), символ(20=пробел)
rep stosw ;// записать АХ в ES:DI, по длине СХ
;// Выводим текст на консоль
mov ah,9
mov dx,mess
int 0x21
;// Ждём любую клавишу, и на выход
xor ax,ax
int 0x16
int 0x20
У меня тасма нет, но должно быть примерно так:
.486
model small
Code SEGMENT use16
ASSUME cs:Code, ds:Code
org 100h
start:
push cs
pop ds
mov ax,3
int 10h
mov ax,0b800h
mov es,ax
mov di,1670 ;// ES:DI = видео/буфер
mov ah,0E0h ;//<--- фон жёлтый
lea si,mess
mov cx,12
next0:
lodsb
stosw
loop next0
next1:
in al,60h
cmp al,1
jne next1
int 20h
mess db "Hello world!", 0
Code ENDS
end start