Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 917
∙ повысить рейтинг >>
Jimhucksly
Статус: 5-й класс
Рейтинг: 474
∙ повысить рейтинг >>
Boriss
Статус: Академик
Рейтинг: 147
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 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 цифры) и в эмуляторе тоже ничего не отображется, хотелось бы узнать почему?

Отправлен: 26.07.2009, 16:47
Вопрос задал: Степанов Александр Андреевич, Посетитель
Всего ответов: 2
Страница вопроса >>


Отвечает _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 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Зенченко Константин Николаевич, Модератор :
    Здравствуйте, Степанов Александр Андреевич.

    Вы спрашивали:

    © Цитата: Степанов Александр Андреевич
    а объяснить можете из-за чего в 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. И только когда непосредственно задан видеорежим создается полная эммуляция работы "железа", т.е. запись в видеобуфер, чтение информации из него видеоконтролером и выводом её на экран

    Удачи!

    Приложение:
    Украина, Киев
    Тел.: +38-097-953-66-19
    Адрес: Украина, Киев

    -----
    Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч

    Ответ отправил: Зенченко Константин Николаевич, Модератор
    Ответ отправлен: 27.07.2009, 22:51

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 252684 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.6 от 21.07.2009

    В избранное