Вопрос № 29781: ;Вот такая довольно простая програмка
.286
.model tiny
CODSEG segment
assume cs:CODSEG
org 100h
_Begin: ;<< точка входа
jmp _start
Int_09h dd ?
Go db 'Заменить',13,10,24h
Back db 'В...
Вопрос № 29.781
;Вот такая довольно простая програмка
.286
.model tiny
CODSEG segment
assume cs:CODSEG
org 100h
_Begin: ;<< точка входа
jmp _start
Int_09h dd ?
Go db 'Заменить',13,10,24h
Back db 'Востановить',13,10,24h
mov ax,word ptr ds:[24h] ;-------------------------------
mov word ptr cs:[Int_09h],ax ;Сохраняем значения вектора
mov ax,word ptr ds:[26h] ;прерываний по адр. 24-27h
mov word ptr cs:[Int_09h+2],ax ;-------------------------------
cli
mov word ptr es:[24h],offset _Obrab ;Заменяем на адрес Обработчика
mov word ptr es:[26h],cs ;
sti
push cs
pop ds
mov dx,offset Go ;Пишем слово "Заменено"
call printf
xor ax,ax
int 16h ;Приостанавливаем прогу
cli
mov ax,word ptr cs:[Int_09h] ;Востанавливаем
mov word ptr es:[24h],ax ;значения вектора
mov ax,word ptr cs:[Int_09h+2] ;прерывания int 09h
mov word ptr es:[26h],ax ;
sti
mov dx,offset Back ;и пишем "Востановлено"
call printf
.exit ;Выход
printf:
mov ax,0900h
int 21h
ret
CODSEG ends
end _Begin
;Так вот вопрос почему при замене строки Int_09h dd ?
;на строки Int_09h dw ?
; dw ?
;программа перестаёт работать?
;И второе, если заменить CODSEG segment...CODSEG ends
;на .code прога тоже не работает, а что косается переделывания
;в EXEшник говорить даже не стоит...
;
;Ответьте кому не лень
;С уважением Maxxxim
Отвечает: Ayl
Здравствуйте, Петров Максим Викторович!
1. Потому что после переопределения на dw у тебя "съезжает" команда call Int_09h. Чтобы все работало надо написать ее в виде call dword ptr [Int_09h]. К тому жежелательно дать адресацию через регистр cs, а не ds, т.к. при вызове обработчика прерывания регистр ds указывает не на твой сегмент. То есть, команда должна выглядеть так: call dword ptr cs:[Int_09h].
2. Насчет замены CODSEG на .CODE я затрудняюсь сказать что-то определенное... Могу только посоветовать запустить компиляцию с выдачей полного листинга (если используешь TASM, то добавь ключ /la) и посмотреть по нему, что именно получилось.
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 18.11.2005, 18:13 Оценка за ответ: 5
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Петров Максим Викторович!
Дело в том, что, когда задано Int_09h dd ?, то команда call Int_09h
преобразуется в call cs:far[102] (в нотации Turbo Debugger-а)
А когда задано Int_09h dw ?,?, то преобразуется в call cs:[102]. Чувствуешь разницу?
В первом случае получается дальний вызов, во втором ближний!
--------- Удачи!