13.12.2018, 01:27 [+3 UTC]
в нашей команде: 3 219 чел. | участники онлайн: 4 (рекорд: 19)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.58 (11.12.2018)

Общие новости:
01.12.2018, 22:30

Форум:
08.12.2018, 14:26

Последний вопрос:
12.12.2018, 18:21

Последний ответ:
12.12.2018, 10:25

Последняя рассылка:
12.12.2018, 23:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
10.03.2010, 15:18 »
Alex1962
Спасибо! Конкретный ответ без заморочек. [вопрос № 177138, ответ № 259999]
04.12.2009, 04:30 »
Brutuss
Спасибо большое! Обязательно учту ваши советы во время покупки! [вопрос № 174730, ответ № 257254]
14.11.2010, 11:48 »
Мироненко Николай Николаевич
Аа, факториал берём, понял! Спасибо Вам большое smile [вопрос № 180732, ответ № 264025]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 825
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 176
Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 19

Перейти к консультации №:
 

Консультация онлайн # 193379
Раздел: • Assembler
Автор вопроса: i.am.krepkov.ivan (Посетитель)
Отправлена: 09.06.2018, 01:28
Поступило ответов: 1

Здравствуйте! Прошу помощи в следующем вопросе:

При написании резидента по книжке Олега Калашникова, не могу понять один момент. В Книге что таблица вектора прерываний в MS-DOS находится в сегменте 0000.
Через отладчик смотрю адрес прерывания 21h по адресу 0000:084 (21h * 4 = 84h). В таблице видно, что адрес 21h -го прерывания располагается по F000:14A0 (Показано на скриншоте в окне m2), но когда я пытаюсь сохранить этот адрес в переменные, или даже просто использую функцию 35h прерывания 21h, то функция выдает совершенно другие значения адреса (06С7:42B7 тоже на скриншоте показано в регистрах es:bx после выполнения ф-ции 35h). Т.е. почему то совсем другие значения чем в таблице по смещению 0000. И самое интересно, что когда я сохраняю эти полученные значения в переменные, а потом пытаюсь пригнуть по ним в обработчик (jmp dword ptr cs:[Var_Vector_Int21) то в отладчике видно, что на самом деле я перехожу по правильному адресу, вместо этих значений, которые сохранились в переменной и которые выдала 35h. Т.е. прыгая по сохраненному адресу 06С7:42B7 на самом деле я прыгнул на правильный адрес, на F000:14A0. Не могу понять как это происходит, может это из-за отладчика проскакивают такие странные значения или все таки я что то упустил?

Приложение:

-----
 Прикрепленный файл (кликните по картинке для увеличения):

Состояние: Консультация закрыта

Здравствуйте, i.am.krepkov.ivan!

Принципы работы отладчиков, как раз касаются изучаемой Вами темы. Разные отладчики работают по разному, одни подменяют первый байт инструкции на 0C3h(int 3), и потом обрабатывают прерывание, другие эмулируют код программы. Каждый раз прерывая программу, отладчик сохраняет все регистры, обрабатывает состояние: выводит состояние памяти и регистров и т.д., когда обработка завершается, отладчик восстанавливает все регистры и все начинается заново. Если сработало прерывание, которое перехватил отладчик, он проверяет его, если это его касается- обрабатывает, если нет передает управление предыдущему обработчику, это есть у Вас в коде:

Код (Assembler) :: выделить код
proc_Int21_Stub proc
;---Проверяем эхо
	cmp ax,8899h
	jnz Label_To_Original_Vector 
;---Уходим в оригинальный обработчик
Label_To_Original_Vector:
	jmp dword ptr cs:[Var_Vector_Int21]
proc_Int21_Stub endp

Именно это и произошло в данном случае, попав на прерывание, которое обрабатывает отладчик, значение адреса было подменено отладчиком(он не хочет, и не будет сам себя отлаживать) и передано управление старому обработчику.

Удачи!


Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 12.06.2018, 15:08

5
нет комментария
-----
Дата оценки: 14.06.2018, 23:13

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 193379

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 1

= общий = | 10.06.2018, 13:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
i.am.krepkov.ivan:

© Цитата: i.am.krepkov.ivan
Не могу понять как это происходит, может это из-за отладчика проскакивают такие странные значения или все таки я что то упустил?

Да, упустили:
Отладчик, это не программа, которая позволяет только смотреть содержимое регистров и памяти. Он(отладчик) делает все, чтобы запущенная под ним программа считала, что она запущена как положено в ОСи. Он показывает ход выполнения отлаживаемой программы, что, как и где меняется.

Набросал код
Код (Assembler) :: выделить код
model	tiny
.code
org	100h
begin:	mov	ah,3ch
	xor	cx,cx
	lea	dx,dbFile
	int	21h
	mov	di,ax
	mov	ah,40h
	mov	bx,di
	mov	cx,400h
	xor	dx,dx
	mov	ds,dx
	int	21h
	mov	ah,3eh
	mov	bx,di
	int	21h
	ret
dbFile	db	'dump400.bin',0
	end	begin


И запстил в чистой ОСи и отладчике:
Дамп чистой ОСи


И дамп отладчика


И еще дамп отладчика под отладчиком. smile



Сразу после запуска любой отладчик, вешает на прерывания свои обработчики и потом в ходе работы отлаживаемой программы их подменяет.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

• Отредактировал: Зенченко Константин Николаевич (Старший модератор)
• Дата редактирования: 10.06.2018, 14:09

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14210 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.58 от 11.12.2018