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

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


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

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

Выпуск № 883
от 22.10.2007, 03:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 376, Экспертов: 22
В номере:Вопросов: 2, Ответов: 4


Вопрос № 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:iptest 12resid 12dos/bios
-тестируемая программаобработчик резидентаоригинальный обработчик
1234:0100h . . .(любые команды) - -
1234:0103hint 10h - -
5678:0110h - . . .(любые команды) -
5678:0122h - call dword ptr cs:[old_10_int] -
0010:2018h - - . . .(любые команды)
0010:3542h - - iret
5678:0127h - . . .(любые команды) -
5678:0150h - iret -
1234:0105hmov 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


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.61.1 от 16.10.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное