Выпуск № 1238 от 31.07.2009, 17:05
Администратор рассылки: Лысков Игорь Витальевич, Модератор
В рассылке: подписчиков - 433, экспертов - 64
В номере: вопросов - 1, ответов - 2
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
Вопрос № 170814: Здраствуйте,помогите разобраться с проблемой arver segment org 100h begin: mov ax,0B800h mov es,ax mov di,0 mov ah,31 mov al, 1 mov es:[di] ,ax mov ah,10h int 16h int 20h arver ends end begin у меня при отк...
Вопрос № 170814:
Здраствуйте,помогите разобраться с проблемой arver segment org 100h begin: mov ax,0B800h mov es,ax mov di,0 mov ah,31 mov al, 1 mov es:[di] ,ax mov ah,10h int 16h int 20h arver ends end begin у меня при открытии com файла ни рожицы,ничего вообще не отображается (менял в регисте al цифры) и в эмуляторе тоже ничего не отображется, хотелось бы узнать почему?
Отвечает _Ayl_, Студент :
Здравствуйте, Степанов Александр Андреевич.
Данный код при выполнении в среде Windows 2000 и выше не приводит к ожидаемому результату потому, что окно DOS-задачи в текстовом режиме в качестве активной использует видеостраницу №1, которая имеет начальный адрес видеопамяти B800:04001000, а приведенный код выводит "рожицу" в видеостраницу №0, которая начинается с адреса B800:0000. Принудительная установка режима (mov ax, 3; int 10h) приводит к тому, что активной
страницей становится нулевая, после чего запись данных в видеопамять приводит и к их отображению. Вместо вызова функции установки режима также может быть использована функция установки активной страницы (mov ax 0500h; int 10h).
Комментарий автора: Вот хоть убей, не помню, откуда взялось смещение 400h. Сидело в голове, что адрес первой страницы имеет такое смещение. На самом деле первая страница в режиме 80*25 начинается с адреса B800:1000, а для режима 40*25 - с адреса B800:0800. В первом случае страница занимает 4000 байт (и 96 байт не используются для выравнивания начального адреса следующей страницы), во втором - 2000 байт (на выравнивание расходуется 48 байт).
-----
∙ Отредактировал: Зенченко Константин Николаевич, Модератор
∙ Дата редактирования: 27.07.2009, 20:00 (время московское)
Ответ отправил: _Ayl_, Студент
Ответ отправлен: 27.07.2009, 02:19
Оценка ответа: 5 Комментарий к оценке: спс
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 252660
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
а объяснить можете из-за чего в windows XP /Vista не пашет?
Смотрите приложение. В приложении программа, которая тестирует
вывод информации в 3-ем текстовом режиме командной оболочкой ХР. Начнем с истории: вывести информацию в чистом MS-DOS можно было четырьмя способами: - использовать функции MS-DOS(21h-е прерывание, я использовал не докумментированую функцию int 29h, информация записывается в видеобуфер либо средсвами BIOS либо своими MS-DOS и выводится на экран); - использовать функции BIOS(int 10h - 09h,10h,0eh,13h, информация записывается в видеобуфер и только потом выводится
на экран); - использовать прямую запись в видеобуфер (именно Ваш вопрос: программа записывает нужную информацию в видеобуфер, а потом видеоконтролер считывает её и выводит на экран); - использовать прямую работу с видеоконтролером(программа передаёт нужную информацию прямо в видеокнтролер минуя посредников, а он её выводит на экран). Именно в такой последовательности эммулируется MS-DOS в command.com Win9x. Разработчики WinNT(2K, XP или Vista) пошли другим путем, они посчитали, что пользователю не
нужно знать как эммулируется их программа в cmd.exe, главное чтобы она выполняла задачи разработчика. Если Вы в WinNT пользуетесь стандартными средствами MS-DOS или BIOS всё проходит гладко, пользователь этого даже не замечает, но с нестандартными методами вывода появляюся проблемы. у Вас именно нестандарный метод. Итак по программе в приложении, что она делает: Информация на экран выводится стандартными ср
едствами MS-DOS или BIOS, а потом ищется в видеобуфере её наличие: Есть несколько вариантов её использования: Вариант №1(вариант №2 должен быть закомметирован)- перед началом вывода устанавливается 3-ий текстовый режим и информация записывается куда нужно.Строки: mov al,10;переход на следующую строку, нужны только чтобы не затиралась информация в варианте №2 int 29h переводят строку именно для второго варианта, пока их не касаемся, но учтем это, т.е. в 3-ем текстовом
режиме одна строка на экране длиною 80-т символов и каждый символ занимает два байта(код символа и цвет+фон), итого получается 16010=A016. Программа выводит информацию в 16-ой системе. Вариант №2 (первый вариант закомментирован), текстовый режим устанавливается после вывода на экран. Заметьте он устанавливается со старшим битом равным 1, строка mov ax,83h, разложите число в битовое представление. Такой вариант позволяет перех
одить в нужный режим не очищая экран. При этом курсор переводится в левый-верхний уголо и вывод начнется именно с этой позиции, именно для этого и переводилась строка. Такой подход заставляет видеоконтролер нужным образом заполнить видеобуфер самому. Теперь вариант №0, когда все варианты отключены, т.е. закомментированы. Это практически и есть Ваша программа, но мы всё делаем методом от обратного, т.е. выводим информацию, а потом ищем нужную запись в видеобуфере. В результате - результата нет. Итого
что имеется: Вариант №1 - информация в видеобуфере есть и программа работает правильно. Вариант №2 - информация в видеобуфере есть, но она копируется когда устанавливается режим без очистки экрана. Вариант №0 - видеобуфер Видео буфер пуст и вывод идет именно четвёртым способом, т.е. прямая работа с видеоконтролером. Но это работа эммулятора WinNT, а не чистой MS-DOS. Еще капельку истории, о том как происходит вывод в эмуляторе. По своей сути эммулятор
WinNT, это только консольное приложение WinNT, которое использует нужные фунции для вывода на экран. После продолжительных споров с эк
спертом Лысковым И. В., мы оба пришли к выводу, что эммулятор CMD.EXE с целью увеличеиня быстродействия приложений пользователя эмулируя функции MS-DOS или BIOS, использует прямую запись информации в видеоконтролер минуя видеобуфер, роль видеоконтролера выполняют консольные функции Windows API. И только когда непосредственно задан видеорежим создается полная эммуляция работы "железа", т.е. запись в видеобуфер, чтение информации из
него видеоконтролером и выводом её на экран
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.