Вопрос № 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?
И где взять?
Отвечает: 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.Вопрос, действительно, не туда. Здесь ждут вопросы по самому АСМу
--------- Удачи!