Консультация № 192110
13.12.2017, 14:47
0.00 руб.
0 6 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
что означает команда
call dword ptr cs:[Int_21h_vect]

call это вызов функции, в Int_21h_vect помещается адрес сегмента и смещение (Пример по Калашникову), а спереди еще и cs.
По ресурсу http://asm-book.ru/faq/0037.php, (там разбор) я не понял начиная с момента m16:16. Можно это дело перевести на понятный русский язык))?

Обсуждение

давно
Посетитель
7438
7205
13.12.2017, 15:23
общий
это ответ
Здравствуйте, Caesar!
[code lang=asm]call dword ptr cs:[Int_21h_vect][/code]1) Полученный старый вектор (смещение:сегмент) в регистрах ES:BX был сохранен в двух словах Int_21h_vect и в следующем за ним.
2) Для длинного перехода по вектору необходимо указывать 32-битный адрес (смещение:сегмент), поэтому необходим модификатор dword ptr.
3) Программа написана в модели Tiny, т.е. сегменты кода, данных, стека равны между собой. Если не указывать, какой сегмент использовать, то для доступа к данным будет использоваться сегментный регистр DS. Но! Мы пишем новый обработчик прерывания! А прерывание вызывается в любой момент времени и при любых значениях сегментных регистров данных и стека! Единственно достоверное значение будет только у сегментного регистра кода! Поэтому необходимо в отработке прерывания либо инициировать DS=CS, либо адресовать данные с помощью регистра CS. Это и делается при помощи префикса CS:

Кстати, обратите внимание, что перед вызовом старого прерывания по сохраненному адресу, необходимо сначала сохранить в стеке флажки командой pushf, чтобы корректно отработала команда iret.
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
13.12.2017, 15:28
общий
Что такое длинный переход?
Вектор = адрес (одинаковые понятия)?
давно
Посетитель
7438
7205
13.12.2017, 15:32
общий
13.12.2017, 15:33
Адресаты:
Длинный переход - со сменой смещения и сегмента кода.
Короткий - переход со сменой только смещения, т.е. в пределах того же сегмента кода.
Я под вектором понимаю длинный адрес процедуры отработки прерывания.
Адрес - более общее понятие, т.е. адрес чего угодно, причем и длинный, и короткий...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
13.12.2017, 16:49
общий
Адресаты:
Цитата: Caesar
я не понял начиная с момента m16:16

Это значит, memory 16 - смещение в сегменте и 16 - сегментный регистр.
Если память не изменяет Вы уже подобное задавали.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401251
75
14.12.2017, 05:16
общий
Адресаты:

Нет. Такого я точно не задавал)
давно
Старший Модератор
31795
6196
14.12.2017, 13:44
общий
Адресаты:
тут, длинный переход, длинный вызов, суть одна. Вопрос только чем завершается код стопом или возвратом
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа