Вопрос № 150115: Здравствуйте уважаемые эксперты! Вот кусок программки: (text segment assume cs:text begin: mov ax,0b800h mov es,ax mov bx,0 mov si,80*2*12+40*2 mov di,80*2*25-2 mov word ptr es:[bx],0f01h mov word ptr es:[si],3130h...
Вопрос № 150.115
Здравствуйте уважаемые эксперты! Вот кусок программки: (text segment assume cs:text begin: mov ax,0b800h mov es,ax mov bx,0 mov si,80*2*12+40*2 mov di,80*2*25-2 mov word ptr es:[bx],0f01h mov word ptr es:[si],3130h mov word ptr es:[di],0e40fh mov ah,01h int 21h mov ax,4c00h int 21h text ends stk segment stack db 60 dup (0) stk ends end begin) Обясните пожалуйста как выводятся символы и атрибуты на терминал (екран), если здесь нет никакого
прерывания DOS или BIOS (имеется ввиду прерывания int 21h (ah=09h или ah=40h),int 10h (ah=09 или ah=0ah)).
Отвечает: an42
Здравствуйте, Олег Миколайович! При включении IBM-совместимого компьютера видеоконтроллер обычно начинает работать в текстовом 16-ти цветном режиме разрешением 80 столбцов на 25 строк (код режима 03h). В этом режиме выделена память размером 32 Кбайт начальным линейным адресом B8000h. Видеопамять в текстовом режиме организована следующим образом: на каждый символ приходится по два байта информации, причем первый байт это ASCII-код символа, а второй байт – цвет символа и цвет фона этого символа. Все то,
что попадает в видеопамять аппаратно выводится на экран монитора.
Столбец 0 Столбец 1 Столбец 2 ….. Столбец 79 Строка 0 | Символ 0 | Символ 1 | Символ 2 | | Символ 79 | | Код | Цвет | Код | Цвет | Код | Цвет | …. | Код | Цвет | Строка 1 | Символ 80 | Символ 81 | Символ 82 | | Символ 159| | Код | Цвет | Код | Цвет | Код | Цвет | …. | Код | Ц
вет | Строка 2 | Символ 160| Символ 161 | Символ 162| | Символ 239 | | Код | Цвет | Код | Цвет | Код | Цвет | …. | Код | Цвет | ………………………………………………………………………………………………….. Строка 24|Символ 1920|Символ 1921|Символ 1922| …. |Символ 1999| | Код | Цвет | Код | Цвет | Код | Цвет | …. | Код | Цвет |
Для вывода в видеопамять обычно используют сегмент ES, в который заносят число равное абсолютному начальному адресу видеобуфера поделенному
на 10h. Для текстовой видеопамяти B8000h делим на 10h, получаем B800h. Чтобы вывести символ в заданное место (строка столбец), нужно номер строки умножить на 80*2 (80 символов по 2 байта на каждый символ) и прибавить номер столбца умноженного на 2. Затем соответствующий бай (ASCII-код символа) заноситься с помощью косвенной адресации относительно сегмента ES и избранного индексного регистра. Значение индексного регистра увеличивается на 1, и в следующий байт запи
сывается код цвета символа и фона. (text segment assume cs:text begin: mov ax,0b800h ;(1) mov es,ax ;(2) mov bx,0 ;(3) mov si,80*2*12+40*2 ;(4) mov di,80*2*25-2 ;(5) mov word ptr es:[bx],0f01h ;(6) mov word ptr es:[si],3130h ;(7) mov word ptr es:[di],0e40fh ;(8) mov ah,01h int 21h mov ax,4c00h int 21h text ends stk segment stack db 60 dup (0) stk ends end begin)
Строка (1) и (2) устанавливаем регистр ES значение 0b800h, это начальный адрес
текстовой видеопамяти. Строка (3) индекс равен 0, это нулевая строка нулевой столбец. Строка (4) индекс соответствует 80*2*12 – двенадцатой строки, 40*2 – сороковому столбцу. Строка (5) индекс соответствует 80*2*25 – это двадцать пятая строка нулевой столбец, а 80*2*25-1*2 – это от двадцать пятой строки нулевого столбца отнимает позицию одного символа и получаем 24 строку и 79 столбец. Строка (6) помещаем ASCII-код (01h) и цвет (0fh) в 0 строку и в 0 столб
ец, это верхний левый угол экрана. Строка (7) помещаем ASCII-код (30h) и цвет (31h) в 12 строку и в 40 столбец, это центр экрана. Строка (8) помещаем ASCII-код (0fh) и цвет (e4h) в 24 строку и в 79 столбец, это правый нижний угол экрана.
Удачи
Ответ отправил: an42 (статус: 7-й класс)
Ответ отправлен: 11.11.2008, 11:35
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 235105 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Скажите "спасибо" эксперту, который помог Вам!
Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
на короткий номер 1151 (Россия)
Номер ответа и конкретный текст СМС указан внизу каждого ответа.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.