адрес обработчика лежит в двойном слове [int_21_vect], а до самой int_21_vect еще нужно дотянуться - по умолчанию mov работает с ds, а тут чтоб не маятся с его(DS) настройкой учитывается тот факт что переменная находится в кодовом сегменте и проще и надежнее до нее дотянуться через cs:
когда обработчик будет вызван - содержимое ds уже не будет как при старте программы равной cs так как хрен его знает что исполнялось перед прерыванием
http://ru.wikipedia.org/wiki/Методы_адресации И еще: То есть для CALL есть только 4 варианта - 2 близких, 2 дальних. В твоем случае нужен дальний вариант. Можно было сделать его вот так: ... db 9Ah Int21_vect dw 0,0 ... Но автор (Калашников) использует это в 2-х местах, для jmp и для Call. Поэтому логичнее было поместить в переменную, что и сделано. К переменной приходится обращаться CALL dword ptr [var_name] А вот за каким хреном Калашников добавил префикс сегмента... )) за очень простым! Вызов оригинального обработчика int 21h идет из резидентной части. Следим за логикой! - установлен перехват вектора прерывания. - в процедуру перехвата попадаем из ЧУЖОГО сегмента (ну да, кто его знает, откуда оно вызывается?) - следовательно, регистры и сегментные регистры НЕ НАШИ, то есть что именно там - неизвестно - однако, в сегментном регистре CS мы можем быть уверены - управление-то у нас! Значит, вместо DS по умолчанию, приходится явно указывать префикс CS - чтоб прочитать именно тот адрес, который нужен. Еще вопросы?
пардон, я наконец понял про что вы спрашиваете после того как вы запускаете свою программу она располагается в памяти одним куском, причем на этот кусок настроены все сегментные регистры поэтому мы можем написать в части инициализации mov word ptr Int_21_vect,bx mov word ptr Int_21_vect+2,es так как что ds(который по умолчанию, надеюсь вы понимаете что mov word ptr Int_21_vect,bx читается как mov DS:word ptr Int_21_vect,bx хоть DS там и не стоит), что cs - который можно явно указать, означают одно и тоже так что можете написать mov CS: word ptr Int_21_vect,bx mov CS: word ptr Int_21_vect+2,es вы заметили что в вашей программе вызова Int_21_proc нету ??? задайте себе вопрос как управление попадет на вашу Int_21_proc ?? скорее всего это произойдет если какой-то другой программе встретится последовательность mov ah,9 int 21h как вы думаете автор этой программы знает о вашем вирусе ??? очевидно нет - так что настраивать ds на сегмент с вашим кодом и данными не будет единственное на что вы можете расчитывать это на то что инструкция int 21h загрузит CS:IP = seg:ofs(Int_21_proc) об остальных регистрах вам ничего не известно - вот и приходится выкручиваться зная что ваша строка гдето рядом с кодом вы можете mov AX,CS mov DS,AX или использовать префикс CS
Ну я юрова как справочник пользовал в основном .. а так отладчик в руки и вперед а вообще если нужно тексты найти легко - тот же абель - изцелион для венды если и т.д.
вот о том и речь изначально и была -- челу дос нужен, пусть курит абеля. а долбить юрова/зубкова/калашникова/пирогова -- пустая трата времени имхо.
bagun08 кстати у абеля про режимы адресации, да и вообще про саму суть адесации написано имхо идеально. сразу глупыя вопросы отпадут