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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 259
от 08.10.2005, 18:33

Администратор:Калашников О.А.
В рассылке:Подписчиков: 267, Экспертов: 31
В номере:Вопросов: 3, Ответов: 11


Вопрос № 27145: Здравствуйте ! У меня вопрос по программе-резидент из выпуска 010(свой вопрос я написал БОЛЬШИМИ буквами, чтобы он отличался от оригинального текста): Int_21h_proc proc pushf ;сохраним в стеке регистр флагов cmp ah,9 ;проверим: ...
Вопрос № 27146: Вопрос: Скажите пожалуйста, существут ли электронный вариант книги: Нортон П., Соухе Д. Язык Ассемблера для IBM PC.- М.: Компьютер, 1993? И где взять?...
Вопрос № 27156: Здараствуйте. Как в Visual C++ 6.0 получать(компилировать) бинарные файлы. Будь то программа написана на Asme или C++ Спасибо...

Вопрос № 27.145
Здравствуйте ! У меня вопрос по программе-резидент из выпуска 010(свой вопрос я написал БОЛЬШИМИ буквами, чтобы он отличался от оригинального текста):
Int_21h_proc proc

pushf ;сохраним в стеке регистр флагов

cmp ah,9 ;проверим: это функция 09h?

je Ok_09

popf ;восстановим регистр флагов

jmp dword ptr cs:[Int_21h_vect] ;Если нет, прейдем на оригинальный обработчик прерывания 21h. Все. На метку Ok_09 программа уже не вернется
ВОПРОС. МОЖНО ЛИ БЫЛО НАПИСАТЬ ТАК : CALL DWORD PTR CS:[INT_21H_VECT] ?
---------
..............
pushf ;так надо! Позже рассмотрим

call dword ptr cs:[Int_21h_vect] ;Вывели нашу строку вместо той, которую надо было

pop dx ;восстановим использованные регистры
ВОПРОС. А ЗДЕСЬ? МОЖНО ЛИ БЫЛО НАПИСАТЬ ТАК: JMP DWORD PTR CS:[INT_21H_VECT] ?
............
И еще один вопрос. У меня стоит Win2k и многие программы не работают(например, метод прямого вывода в буфер или этот же самый резидент). Я слышал, что это из за того, что Win2000 работает в защищенном режиме, а программы пишутся для реального режима. Так ли это? Если так, то есть какие - нибудь методы решения данной проблемы. А то постоянно грузиться в DOS утомительно.


Отправлен: 03.10.2005, 08:01
Вопрос задал: Iluha (статус: 1-ый класс)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Iluha!
используй WIN32 программирование
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 03.10.2005, 09:53

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Iluha!
Выбор использования JMP-a или CALL-а зависит от того, что тебе требуется.
JMP применяют тогда, когда надо просто перейти на старый вектор, больше ничего делать не надо, и возврат в основную программу сделает старый вектор.
CALL же тогда, когда необходимо сначала отработать старый вектор, а потом что-то еще там сделать и самому же вернуться в основную программу по IRET.
При этом не надо забывать о необходимости наличия в стеке слова флажков, т.к. старый вектор, вызванный по CALL, вернет управление по IRET с восстановлением из стека флажов. Сказанное относится и к JMP.
По второму вопросу уже кратко и однозначно ответили...Надо переходить на Win32
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 4-ый класс)
Отправлен: 03.10.2005, 10:33
Оценка за ответ: 4

Отвечает: Ayl
Здравствуйте, Iluha!

В данной программе - нельзя.

Последовательность команд
pushf
call dword ptr cs:[Int_21h_vect]

выполняет вызов старого обработчика прерывания и по его завершении возвращается в текущий обработчик.

А передача управления старому обработчику с помощью jmp при начальном состоянии стека приведет к тому, что при завершении работы старого обработчика управление будет возвращено в прерванную программу, минуя текущий обработчик.

Так вот, в первом случае (когда вызываемая функция не 9) нам нужно передать управление старому обработчику и не возвращаться в текущий. Для этого из стека убирается сохраненный регистр флагов и выполняется передача управления старому обработчику по команде jmp.

Во втором случае нужно вызвать старый обработчик и после этого выполнить дополнительные действия, т.е. нужно, чтобы после выполнения старого обработчика управление вновь получил текущий обработчик. Для этого и производится вызов старого обработчика с помощью команды call (с предварительным сохранением регистра флагов для команды iret).

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 03.10.2005, 18:38
Оценка за ответ: 5

Отвечает: Sager
Здравствуйте, Iluha!
По поводу второго вопроса:
чтобы работал метод прямого вывода в буфер, нужно вначале написать следующее:
mov ax,3
int 10h
у меня этот резидент в XP работает(может ты там чё изменял?)
В винХП/2000 эмулируется работа мс-дос, программы могут глючить, если криво написан сам эмулятор. Как вариант, если тебе не устраивает виндовый дос-бокс, можешь установить виртуальную машину VMWare и на нее установить чистый дос и не надо будет постоянно перегружаться.
Ответ отправил: Sager (статус: 9-ый класс)
Отправлен: 03.10.2005, 20:22
Оценка за ответ: 5

Отвечает: Bob Johnson
Здравствуйте, Iluha!
По второй части вопроса - win2k умеет эмулировать реальный режим (dos-задачи). но для того, чтобы тестировать например какой-нибудь резидент, тебе нужна постоянно висящая дос задача (например Volcov Commander), из которой ты будешь запускать резидент. Иначе винда может его прибить, т.к. cmd.exe, внешне хоть и не отличается от дос задачи, все же виндовая.
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 03.10.2005, 22:11

Отвечает: Юра Устинов
Здравствуйте, Iluha!
Не знаю про выпуски, но на последний вопрос отвечу. Если ты пишешь в текстовый буфер, то тебе нужно переключиться на правильную страницу(почитай по 10h прерывание), а если в видеобуфер, то у тебя всё должно выводиться, следи за последовательностью.
{
mov ax,13h
int 10h
mov ax,0a000h
mov es,ax
mov di,32000 ;указывает точку в которую пишешь
mov al,10 ;а это цвет
stosb ;сама функция записи al в память по адресу es:di
}
В виндовсе когда ты запускаешь программу расчитанную на реальный режим, она включается в режиме эмуляции реального режима
---------
Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 1-ый класс)
Отправлен: 04.10.2005, 06:30


Вопрос № 27.146
Вопрос:
Скажите пожалуйста, существут ли электронный вариант книги:
Нортон П., Соухе Д. Язык Ассемблера для IBM PC.- М.: Компьютер, 1993?
И где взять?
Отправлен: 03.10.2005, 08:24
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Sager
Здравствуйте, Терсков Алексей Николаевич!
Здесь есть:
http://rkd5.narod.ru/Bibl12.htm
Ответ отправил: Sager (статус: 9-ый класс)
Отправлен: 03.10.2005, 20:30
Оценка за ответ: 4
Комментарий оценки:
Дайте ссылку по конкретнее, немогу найти и скачать

Отвечает: Bob Johnson
Здравствуйте, Терсков Алексей Николаевич!
У меня на странице есть "Электронная версия книги Питера Абеля "Ассемблер и программирование для IBM PC". Другое возможное название книги "Язык ассемблера для IBM PC". " - оно?
http://bobjohnson.nm.ru/files.html
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 03.10.2005, 22:07
Оценка за ответ: 4
Комментарий оценки:
Неа!

Отвечает: FrmAcid
Здравствуйте, Терсков Алексей Николаевич! Посмотрите здесь ссылка вроде ещё работает.

http://www.ruhelp.org/pages/det.php?id=28&l=A
Ответ отправил: FrmAcid (статус: 1-ый класс)
Отправлен: 03.10.2005, 23:41
Оценка за ответ: 4
Комментарий оценки:
Не то!! мне Нортон нужен, а не Абель

Отвечает: Boriss
Здравствуйте, Терсков Алексей Николаевич!
Мда, и я не нашел.
Вот только: Учебное пособие подготовлено по материалам книги:
П. Нортон, Д. Соухе. Язык ассемблера для IBM PC:

http://yarchat.net76.ru/forum/viewtopic.php?p=13805&sid=6e3251f3dd140df86690318377d723fc
---------
Прорвемся! (Быть может :(( )
Ответ отправил: Boriss (статус: Профессор)
Отправлен: 07.10.2005, 14:33


Вопрос № 27.156
Здараствуйте.

Как в Visual C++ 6.0 получать(компилировать) бинарные файлы. Будь то программа написана на Asme или C++

Спасибо
Отправлен: 03.10.2005, 14:16
Вопрос задал: Swu (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Swu!
Выскажу предположение: хочется получить из исходника С/С++ листинг в виде ассемблерных команд?
Если я прав, то тогда надо сделать следующее (для VC6.0):
Ввойти в установки проекта, далее на вкладке С/С++ выбрать категорию "Listing Files". Ну и, наконец, в Combobox-e "Listing file type" выбрать то, что хочется...
И тогда во время компиляции получится файл с расширением .COD.
P.S. Четче надо излагать свои вопросы...
P.S.S.Вопрос, действительно, не туда. Здесь ждут вопросы по самому АСМу
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 4-ый класс)
Отправлен: 03.10.2005, 17:04


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

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Rambler's Top100 Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Архив рассылки
Отписаться
Вспомнить пароль

В избранное