[Закрыть]
 
popoff.donetsk.ua
Рамирез однажды сказал: «Если я думаю, что мы станем друзьями, то я буду больше общаться, расскажу о себе больше и сделаю все, чтобы дружба развивалась. Если я не вижу в человеке друга, то сделаю все наоборот».
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Форум - Функциональное и логическое программирование - Ассемблер - почему не работают программы?

Ассемблер - почему не работают программы?

форумы popoff.donetsk.ua
Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Автор Сообщение
Гость kentussharelus url://forum.message:2239
Ассемблер - почему не работают программы?
kentussharelus

Здравствуйте! Я создал этот топик потому, что не нашёл на форуме ничего похожего, однако потребность в разъяснении причин неработоспособности программ, я думаю, есть не только у меня. И, наверное, найдутся еще бедолаги, которые бились 3 дня над прогой, но так и не заставили ее работать правильно (или работать хоть как-то). Собственно, к моему делу. Вопрос касается резидентных программ. Перерыл кучу учебников и примеров, смог понять алгоритм написания резидентной программы. Я думаю, вот он:
1. Перехватить нужные прерывания (если это необходимо)
1.1 Сохранить старые векторы
1.2 Определить новые
2. Определить размер резидентной или точку начала нерезидентной части
3. Вызвать сответствующую функцию.
При этом при определении своих обработчиков прерываний как правило нужно вызывать и старую функцию с помощью JMP или CALL. Я приведу пример exe-программы, которая по идее должна переопределить вектор int 09 (клавиатура). Но в своей функции я просто хочу вызвать старую функцию, как будет ничего и не делал. По сути, моя функция просто вызывает стандартную, и всё. Вот текст программы :
CODE SEGMENT
ASSUME CS : CODE
OLD09O DW ?
OLD09S DW ?
BEG:
INT09 PROC FAR
MOV ES,OLD09S
JMP DWORD PTR ES:[OLD09O]
INT09 ENDP
BEGIN:
MOV AX,3509H
INT 21H
MOV OLD09S,ES
MOV OLD09O,BX
MOV AX,2509H
LEA DX,INT09
INT 21H
MOV AX,SIZE OLD09S+SIZE OLD09O+16
MOV DX,BEGIN-BEG+16
MOV CL,4
SHR AX,CL
SHR DX,CL
ADD DX,AX
ADD DX,10H
MOV AX,3100H
INT 21H
CODE ENDS
END BEGIN
Я ее скомпилил линкером, получилсяс ехе файл.После его запуска снова включается оболочка ДОСа, как будто все хорошо. То есть программа - осталась резидентной. Управление вернулось в ДОС. Но когда я нажимаю любую клавишу появляется око (ДОС - в окне Виндовса) : «Процеесор выполнил недопустимую операцию. Приложение бдет закрыто». Не могу совсем понять, что где не так. Очевидно, при вызове моей функции Int09, думаю. Хотелось бы понять, почему оно не работает и  увидеть что и куда нужно долбавить или изменить, чтобы оно заработало :) .
С уважением, kentussharelus

popoff
Yuri
Июл, 2004
Сообщений: 923
popoff url://forum.message:2243

1. Вы не устанавливаете регистр DS перед вызовом 25-й функции.

2. Насчёт значения в регистре DX перед вызовом 31-й функции я тоже не уверен. В частности, добавление 16 - не понятно, почему именно 16 Вы там добавляете.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен
Вход
Поиск[?]:
porter.mir.dn.ua