Запись символов ASCII в видеопамять в сборке с TASM на 8086

Мне нужно написать программу для записи символов ASCII в видеопамять.

.model tiny
.stack
.data
.code
main: 

mov ax, 0b800h
mov ds, ax

mov aL, 'x'
mov es, bx
mov es:[1], aL

mov ah, 4ch
int 21h

end main

Этот код пока инертен; он компилируется, запускается и затем завершает работу, ничего не печатая. Кажется, я пропускаю строчку.


person user2241226    schedule 07.04.2013    source источник
comment
возможный дубликат Печать строки без ОС   -  person nrz    schedule 07.04.2013
comment
Вы устанавливаете ds в 0b800h, а es в неопределенное значение или, по крайней мере, не 0b800h (bx). А затем вы используете es для адресации видеопамяти, что явно не работает.   -  person nrz    schedule 07.04.2013
comment
гениально, это было глупо с моей стороны. однако я по-прежнему не могу напечатать символ таким образом, и программа ведет себя как раньше.   -  person user2241226    schedule 07.04.2013
comment
На уровне ассемблера (по крайней мере, в x86) строка не является типом данных, это всего лишь абстракция в голове программиста. Вы можете называть данные ASCII-символами или строками, на уровне сборки все то же самое: какие-то значения хранятся в каких-то адресах памяти, вот и все.   -  person nrz    schedule 07.04.2013
comment
Полезно знать, но я до сих пор не вижу, чего именно здесь не хватает. До сих пор мне удавалось последовательно печатать только строки, но я не мог писать в видео. Память.   -  person user2241226    schedule 07.04.2013
comment
У вас неправильное смещение для кода ASCII (es:[1]) (нечетные смещения для цветов и атрибутов), и вы не определяете цвет (ну, ваш байт цвета и атрибута равен 0x78, то есть x). См. мой ответ stackoverflow.com/questions/ 15462807/ .   -  person nrz    schedule 07.04.2013
comment
как определить цвет?   -  person user2241226    schedule 07.04.2013
comment
Верхние 4 бита определяют цвет фона, а младшие 4 бита определяют цвет текста (или наоборот). Попробуйте использовать 20ч. AFAIR, это черный текст на зеленом фоне.   -  person Alexey Frunze    schedule 07.04.2013
comment
простите мое невежество, не могли бы вы показать мне в контексте?   -  person user2241226    schedule 07.04.2013
comment
@user — каждая позиция на экране состоит из двух байтов, один из которых содержит код символа, а другой — цвет. Если вы не установите оба, вы можете получить черный символ на черном фоне. Довольно тяжело читать!   -  person Bo Persson    schedule 07.04.2013
comment
какой цветовой код входит в es[n] для создания текста и цвета фона?   -  person user2241226    schedule 07.04.2013


Ответы (1)


Для возможности записи в видеопамять установите ES на 0b800h Укажите место (Offset) на экране, где вы хотите писать. Установите для DI значение (row*(max. rows (80))+col)*2 (ROW и COL основаны на нуле). Например, для записи третьего символа в 10-й строке используйте «mov di, (2*80+9)*2». Укажите цвета в AH. Установите для AH значение (backgroundcolor*16+foregroundcolor), например, чтобы написать светло-серые (7) буквы на черном (0) фоне, используйте "mov ah, 7" Используйте инструкцию STOSW вместо "mov es:[адрес]", al . Таким образом, вы можете динамически писать в разные места на экране.

person Van Uitkon    schedule 08.12.2014