Записать символ в видеобуфер MASM
Я пытаюсь написать букву "D" синим цветом на белом фоне, переместив ее в видеобуфер. Что не так с этим кодом?
ВКЛЮЧИТЬ Irvine16.inc .код основной ПРОЦ мув топор,@data мов дс, топор мов си, 0b800h мов слово ptr [si], 44 ч MOV слово PTR [Си +2] 0701h мов ах, 08ч в 21 час выход основной ENDP
Внесены изменения в выше. Теперь он собирается, но ничего не отображается.
3 ответа
Пример примера:
название "привет-мир" орг 100ч; установить режим видео мов топор, 3; текстовый режим 80x25, 16 цветов, 8 страниц (ах =0, ал =3) int 10h; сделай это!; отмени мигание и включи все 16 цветов: мов топор, 1003ч MOV BX, 0 10 ч; установить сегментный регистр: мов топор, 0b800h мов дс, топор; печать "Привет, мир"; первый байт является кодом ASCII, второй байт является кодом цвета. мов [02h], 'h' mov [04h], 'e' мов [06h], 'l' мов [08h], 'l' mov [0ah], 'o' mov [0ch], ',' mov [0eh], 'w' mov [10h], 'o' mov [12h], 'r' mov [14h], 'l' мов [16h], 'd' mov [18h], '!'; раскрасить все символы: mov cx, 12; количество символов. мов ди, 03h; начать с байта после 'h' с: мов [ди], 11101100b; светло-красный (1100) на желтом (1110) добавить ди, 2; пропустить следующий код ASCII в памяти VGA. петля с; дождитесь нажатия любой клавиши: мов ах, 0 в 16 часов RET
Надеюсь, этот образец поможет вам
1) 0b800h - адрес сегмента видеобуфера. mov word ptr [si], 44h
адреса только смещение (здесь: 0b800h) адреса сегмента в DS
- а также DS
не указывает на видео буфер Я предлагаю загрузить видео сегмент в ES
и использовать переопределение сегмента (ES:
).
2) Буква плюс цвет образуют слово. В буфере видео сначала идет буква, затем цвет. Цвет фона и переднего плана использует каждый кусочек (4 бита). Из-за "немного порядкового номера" (Google для него) слово должно иметь формат цвет / буква, например, белый / синий /'D' = 7144h
Это совместимый с Irvine16 пример:
INCLUDE Irvine16.inc
INCLUDELIB Irvine16.lib
.CODE
main PROC
; mov ax,@data ; No .DATA in this example
; mov ds,ax
mov si, 0b800h ; Initialize ES with video buffer
mov es, si
xor si, si ; Position 0 is top left
mov word ptr es:[si], 7144h ; White background ('7'), blue foreground (1), letter 'D' (44)
mov ah, 08h ; Wait for key - http://www.ctyme.com/intr/rb-2561.htm
int 21h
exit ; Irvine16: end of program
main ENDP
END main
Посмотрите на листинг 15 здесь: