25.01.2020, 12:23 [+3 UTC]
в нашей команде: 4 166 чел. | участники онлайн: 3 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.80 (15.01.2020)
JS-v.1.35 | CSS-v.3.36

Общие новости:
06.01.2020, 22:45

Форум:
13.01.2020, 16:40

Последний вопрос:
24.01.2020, 12:36
Всего: 151479

Последний ответ:
24.01.2020, 20:57
Всего: 259687

Последняя рассылка:
24.01.2020, 21:46

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
26.02.2019, 14:21 »
dar777
Это самое лучшее решение! [вопрос № 194760, ответ № 277536]
12.10.2017, 06:15 »
ter4nastya
Игорь Витальевич, большое вам спасибо за то, что помогли мне. Вы очень меня выручили! [вопрос № 191459, ответ № 275358]
13.02.2019, 13:23 »
dar777
Это самое лучшее решение! [вопрос № 194659, ответ № 277461]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 748
solowey
Статус: Специалист
Рейтинг: 273
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 209

Перейти к консультации №:
 

Консультация онлайн # 144909
Раздел: • Assembler
Автор вопроса: Швецов Анатолий Прокофьевич
Отправлена: 24.09.2008, 17:59
Поступило ответов: 1

В книге Калашникова в главе 3 есть программа для практики, которая должна отображать символ (01 - рожица в ASCII кодах) ярко-белым цветом на синем фоне. К сожалению у меня она не отразилась, хотя com-файл был создан. Я добавил (по наитию) очистку экрана. Рожица отразилась, но грязно белая на черном экране. Хотелось бы получить обещанное. На всякий случай в приложение помещаю код программы.
Помогите разобраться. Изучаю Ассемблер не больше месяца, использую MASM 6.11. Поэтому, прошу побольше комментарий.
С уважением, Швецов

Приложение:

Состояние: Консультация закрыта

Здравствуйте, Швецов Анатолий Прокофьевич!

До этого момента Вы работали только в одном сегменте памяти размером 64кб. Все сегментные регистры имели одинаковое значение. Данный пример демонстрирует работу с сегментами, а именно прямую запись в видеобуфер с помощью индексного регистра DI.
В реальном режиме работы процессора доступны 16-ть сегментов по 64кб, т.е. 1 мб. Любой физический адрес вычисляется как сумма сегментного регистра(CS,DS,ES,SS) и регистра общего назначения (AX,BX,CX,DX,DI,SI,BP,SP). У каждого регистра общего назначения есть дополнительная функция возложенная на него разработчиками.
К примеру:
AX - аккумулятор, в нем производятся основные арифметические вычисления, команды использующие этот регистр имеют более которкий код и выполняются быстрее;
BX - базовый регистр, очень полезен при работе с массивами, может применятся с регистрами DI и SI([ BX + DI ]);
CX - счетчик, используется в оператора цикла и некотороых строковых командах;
DX - регистр данных, в некоторых командах используется как разширитель аккумулятора, если результат работы превышает размер 16-ть бит;
DI - индекс приемника;
SI - индекс источника;
Два последних регистра используются в строковых командах.
Все выше перечисленные регистры по умолчанию используются вместе с регистром DS;
BP - база стека, может применятся с регистрами DI и SI([ BP + SI ]);
SP - указатель стека;
Эти два регистра по умолчанию работают только с регистром SS.
Установленные по умолчанию регистры можно измеять, так как это сделано в приведенном Вами примере mov es:[di],ax, т.е. записать слово по адресу определенному в регистрах ES:DI. Вся физическая память реального режима разбита на области:
00000-А0000 - рабочая и служебная область DOS;
А0000-С0000 - буфер видеопамяти;
С0000-FFFFF - служебная область BIOS.
В контексте Вашего вопроса: область видеопамяти используется видеоконтролером для хранения отображаемой информации. Для каждого видеорежима установленны свои адреса. Сегментный адрес 0b800h используется в режимах 00-06. Смещение относительно начала сегмента в памяти соответствует отображаемому символу на экране. В данном примере DI=0 т.е. верхний-левый угол.
К примеру если Вы запишите mov di,100, то у отображаемый символ сместится. Проверьте.
Также Вы можете по эксперементировать и с сегментным регистром, к примеру:
mov ax,0b000h
mov es,ax
mov di,8000h
.
При получении физического адреса сегментный регистр умножается на 16-ть и складывается с индексным регистром, т.е. получается 0b8000+00000 это равно 0b0000+08000. Для программиста такая процедура получения адреса прозрачна, т.к. это всё реализованно на аппаратном уровне.

Для установленого Вами режима на каждый символ отводится два байта: сам ASCII-код и его аттрибут.
На нем и остановимся: биты 0-3 определяют цвет символа, биты 4-6 определяют цвет фона, бит 7 - яркость.
Цвета располагаются в таком порядке (00=черный, темно-синий, темно-зеленый, бирюзовый, темно-красный, темно-коричневый, коричневый и 07=серый)- для фона и текста, дальше только для текста(08=темно-cерый, синий, зеленый, голубой, красный, фиолетовый, желтый и 15=белый). Попробуйте менять аттрибуты в строке mov ah,31.

Строками:
mov ax,3
int 10h

Вы переводите видеоконтролер в 3-й текстовый видеорежим. Это нужно делать во всех DOS-примерах(из учебника) запускаемых под ХР. Если страший бит регистра AL установить в 1, то очистки экрана не будет: mov ax,83h.

О видах адресации советую почитать С. Зубкова, о работе с видеоконтролерами - В. Кулакова. Эти книги Вам пригодятся в дальнейшем.
Удачи!


Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 24.09.2008, 22:00

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14088 сек.

© 2001-2020, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.80 от 15.01.2020
Версия JS: 1.35 | Версия CSS: 3.36