Вопрос № 105672: Уважаемые эксперты, в главе 12 книги Калашникова ("БХВ-Петербург", 2007) на стр. 127 написано, цитирую: "Как вам уже известно, регистр cs всегда содержит номер сегмента, в котором находится наша программа, а ip - смещение. Допустим, пр...Вопрос № 105694: Здраствуйте Уважаемые эксперты
У меня неполучается реализовать запись данных с памяти в файл. кусок кода как я пытаюсь это зделать дан в приложении. при выполнении в регистре al появляется 05 как я понял это значит что "доступ запрешён"...
Вопрос № 105.672
Уважаемые эксперты, в главе 12 книги Калашникова ("БХВ-Петербург", 2007) на стр. 127 написано, цитирую: "Как вам уже известно, регистр cs всегда содержит номер сегмента, в котором находится наша программа, а ip - смещение. Допустим, процедура обработки прерывания 10h расположена по адресу 0010:0400h, а наша программа загрузилась в сегмент1234h. Тогда получаем:
;cs:ip = 1234:0100h
...
[1234:0100h] mov ax,8899h
После выполнения данной инструкции cs:ip=1234:0103h
[1234:0103h] int 10h
;Теперь cs:ip=сегменту/смещению адреса (вектора) прерывания 10h, т.е. [0010:0400h]
[1234:0105h] mov bx,10
;Работаем дальше после того, как прерывание завершило свою работу
..."
В связи с этим несколько вопросов. Первый: о какой именно "нашей программе" во втором предложении идёт речь? В главе 12 две программы: Resid12 и Test12. Если Resid12, то в ней же находится обработчик прерывания и получается, что часть Resid12 будет грузиться в сегмент 0010h, а другая в 1234h, что невозможно.
Второй вопрос, почему после команды int 10h меняется регистр cs? Нигде не мог прочитать, что это прерывание может изменять регистр. Ради интереса написал программу в 2 строки: (1) mov ax,8899h (2) int 10h Регистр cs менялся, но почему - не понял.
И последний вопрос, к чему автор написал:
"[1234:0103h] int 10h
;Теперь cs:ip=сегменту/смещению адреса (вектора) прерывания 10h, т.е. [0010:0400h]", ведь следующая строка "[1234:0105h] mov bx,10" оставила регистр cs без изменений, а, по идее, должен быть адрес [0010:0400h], вместо [1234:0105h]. Или это опечатка?
Заранее спасибо.
Отправлен: 16.10.2007, 17:47
Вопрос задал: Masada (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Masada!
В каждый момент времени процессор может выполять только одну команду, при этом регистры CS:IP указывают на адрес следующей команды. Резидентные программы перехватывают прерывания записывая в таблицу [0000:0000] адреса своих обработчиков. Допустим Вы перехватили 21h-прерывание и в обработчике будет команда int 21h, куда Вы попадете - снова на свой же обработчик :-). Именно по этому когда возникает необходимость использовать стандартные функции дос или биос в обработчике используют
JMP или CALL с адресом оригинального обработчика. Команда INT number аналогична команде CALL FAR segment:label, она помещает в стек регистр флага,как команда CALL FAR помещает в стек регистры CS:IP с адресом следующей команды, считывает из таблицы прерываний [0000:4*number] адрес обработчика(segment:label) и передаёт ему управление. Приблизительно так будет выглядеть работа программ TEST12 и RESID12 (все адреса в таблице произвольные):
cs:ip
test 12
resid 12
dos/bios
-
тестируемая программа
обработчик резидента
оригинальный обработчик
1234:0100h
. . .(любые команды)
-
-
1234:0103h
int 10h
-
-
5678:0110h
-
. . .(любые команды)
-
5678:0122h
-
call dword
ptr cs:[old_10_int]
-
0010:2018h
-
-
. . .(любые команды)
0010:3542h
-
-
iret
5678:0127h
-
. . .(любые команды)
-
5678:0150h
-
iret
-
1234:0105h
mov bx,10
-
-
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 19.10.2007, 16:05 Оценка за ответ: 5 Комментарий оценки: Ответ, судя по прилагаемой таблице, занял немало времени и усилий, за что я и благодарен.
Вопрос № 105.694
Здраствуйте Уважаемые эксперты
У меня неполучается реализовать запись данных с памяти в файл. кусок кода как я пытаюсь это зделать дан в приложении. при выполнении в регистре al появляется 05 как я понял это значит что "доступ запрешён"
Помогите пожалуйста реализовать запись в файл, желательно с примером :)
С Уважением, Станислав.
Приложение:
Отправлен: 16.10.2007, 20:43
Вопрос задал: Станислав (статус: 1-ый класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Станислав!
Cмотрите приложение.
Удачи!
Приложение:
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 17.10.2007, 11:37 Оценка за ответ: 5
Отвечает: An42
Здравствуйте, Станислав!
Идея работы с файлов в MS DOS заключается в следующем:
1.Файл должен быть открыт, имя файла указывается в формате ASCIIZ, в конце имения файла должен стоять код 0. (пример nfile db ‘c: empedit42.doc’,0 или nfile db ‘zero.111’,0) в во втором случае файл берется из текущего каталога.
2.После того как файл удачно открыт ему присваивается число (дескриптор), в дальнейшем работа с этим файлом будет происходить через этот дескриптор.
3.В конце работы файл нужно закрыть. (при закрытии файла на диск сбрасываются все буфера, обновляется время и дата последней корректировки файла)
4.Признаком ошибки при выполнении функции DOS является установка флага переноса.
Если файл создается функцией ah=3Ch, то в отличие от открытие существующего файла функцией ah=3Dh, файл создается и открывается в режиме чтения и записи, и в регистр CX нужно поместить атрибут файла (пример CX=0 для обычного файла)
Все необходимые пояснения есть в примере
Удачи
Приложение:
Ответ отправил: An42 (статус: 5-ый класс)
Ответ отправлен: 18.10.2007, 12:57 Оценка за ответ: 5
Отвечает: Овчинников Алексей
Здравствуйте, Станислав!
Всё дело втом что вы уже открыли свой файл,
функция DOS 3ch, не только создаёт но и сразу открывает
файл, а вы повторно пытаетесь его открыть функцией
3Ch.
Ответ отправил: Овчинников Алексей (статус: 1-ый класс)
Ответ отправлен: 20.10.2007, 00:06