Вопрос № 144909: В книге Калашникова в главе 3 есть программа для практики, которая должна отображать символ (01 - рожица в ASCII кодах) ярко-белым цветом на синем фоне. К сожалению у меня она не отразилась, хотя com-файл был создан. Я добавил (по наитию) очистку эк...Вопрос № 144965: Здравствуйте уважаемые эксперты! Подскажите как можно вывести содержимое какого либо регистра: например сложить какие либо числа, а результат вывести <img
src="http://rusfaq.ru/images/Forum/75.gif" border="0"> ...Вопрос № 144969: Уважаемые эксперты помогите решить следующую задачу. Нужно сделать резидент который бы перехватывал бы ДОС прерывание «вывод строки на экран» и копировал эту строку в файл. Я тут начал это делать но столкнулся с проблемой я не могу использовать прер...Вопрос № 145023: нужно сделать 3 легких задачки,
в ассемблере ни алё <img src="http://rusfaq.ru/images/Forum/7.gif" border="0"> помогите пожалуйста! 1 - Если введены символы с 0-9 вывести соощение "ето цифра!" 2 - Ввести символ, занулить в его код...
Вопрос № 144.909
В книге Калашникова в главе 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.
О видах адресации советую почитать С. Зубкова, о работе с видеоконтролерами - В. Кулакова. Эти книги Вам пригодятся в дальнейшем. Удачи!
--------- Итерация от человека, рекурсия — от Бога (Питер Дойч)
Ответ отправил: Зенченко Константин Николаевич (статус: Профессор) Украина, Киев Тел.: +380979536619 Адрес: Украина г.Киев ---- Ответ отправлен: 24.09.2008, 22:00
Вопрос № 144.965
Здравствуйте уважаемые эксперты! Подскажите как можно вывести содержимое какого либо регистра: например сложить какие либо числа, а результат вывести
Отправлен: 25.09.2008, 09:03
Вопрос задал: Sharkerr (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Sharkerr!
Код в приложении выводит содержимое регистра АХ в 10-ой системе. Удачи!
Приложение:
--------- Итерация от человека, рекурсия — от Бога (Питер Дойч)
Ответ отправил: Зенченко Константин Николаевич (статус: Профессор) Украина, Киев Тел.: +380979536619 Адрес: Украина г.Киев ---- Ответ отправлен: 25.09.2008, 10:42 Оценка за ответ: 5 Комментарий оценки: Большое спасибо
Вопрос № 144.969
Уважаемые эксперты помогите решить следующую задачу. Нужно сделать резидент который бы перехватывал бы ДОС прерывание «вывод строки на экран» и копировал эту строку в файл. Я тут начал это делать но столкнулся с проблемой я не могу использовать прерывания в резиденте так как сам их перехватываю. И не уверен что правильно определил по какому адресу находится строка. Пожалуйста доведите мою программу до ума.
Приложение:
Отправлен: 25.09.2008, 09:43
Вопрос задал: Sergik1977 (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 5)
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Sergik1977!
Программа в приложении. Адрес строки у Вас уже есть в паре регистров DS:DX. Неизвестно только длина строки, которая ограничена символом '$'. Именно поэтому копирование в строки в буфер лишнее, т.к. она может быть очень большой, а это может привести к сбою в работе Вашего резидента. Удачи!
Приложение:
--------- Итерация от человека, рекурсия — от Бога (Питер Дойч)
Ответ отправил: Зенченко Константин Николаевич (статус: Профессор) Украина, Киев Тел.: +380979536619 Адрес: Украина г.Киев ---- Ответ отправлен: 25.09.2008, 12:49 Оценка за ответ: 5
Вопрос № 145.023
нужно сделать 3 легких задачки, в ассемблере ни алё помогите пожалуйста!
1 - Если введены символы с 0-9 вывести соощение "ето цифра!" 2 - Ввести символ, занулить в его коде 0,3,5,7 биты и вывести символ который получился 3 - Найти сумму положительных элементов массива. Элементы байты, кол-во 7
Заранее большое человеческое спасибо!
Отправлен: 25.09.2008, 17:09
Вопрос задал: Timeisover (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Boriss
Здравствуйте, Timeisover! В приложении решение Вашей задачи. Если что не будет понятно - спросите в минифоруме этого вопроса
Приложение:
--------- Вывод - то место в тексте, где вы устали думать
Ответ отправил: Boriss (статус: Профессор) Россия, Саранск Организация: Мордовский госуниверситет, Саранск, Факультет Электронной Техники WWW:Программирование на Паскале ---- Ответ отправлен: 27.09.2008, 20:58