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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 296
от 23.11.2005, 20:48

Администратор:Калашников О.А.
В рассылке:Подписчиков: 257, Экспертов: 23
В номере:Вопросов: 1, Ответов: 3


Вопрос № 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

_Obrab: ;Перехват прерывания 09h
pushf
call Int_09h
iret

_start:
xor ax,ax
mov ds,ax
mov es,ax

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
Отправлен: 18.11.2005, 17:32
Вопрос задал: Петров Максим Викторович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: 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]. Чувствуешь разницу?
В первом случае получается дальний вызов, во втором ближний!
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 9-ый класс)
Отправлен: 18.11.2005, 18:28

Отвечает: Евгений Иванов
Здравствуйте, Петров Максим Викторович!
писать нужно так

_Obrab: ;Перехват прерывания 09h
pushf
db 09Ah
Int_09h dd 0
iret
а лучше вот так
_Obrab: ;Перехват прерывания 09h
db 0EAh
Int_09h dd 0

только непонятно, зачем ты вызываешь прежний обработчик, если ничего не делаешь? :))))

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 18.11.2005, 18:31


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

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

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

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

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


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


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Архив рассылки
Отписаться
Вспомнить пароль

В избранное