65 / 65 / 1
Регистрация: 14.04.2010
Сообщений: 170
1

Отладка приложения с прерываниями

13.07.2010, 02:21. Показов 7300. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые! Ув-е потому, что я действительно уважаю тех, кто добился совершенства в этом не лёгком труде!
Такой вопрос. Тоесть как видно из темы меня интересует прерывание, но не какое-то конкретное, а вообще суть его. Тоесть допустим при тестировании в отладчике проги, это как естественное мероприятие, часто вызывается какое-то прерывание int 10 , int 16 , int 21. Так вот допустим при вызове int 21 в AFDPRO надо нажать раз 10-ть F1 , чтобы вернуться к коду проги. Тоесть допустим идёт по шагово код проги, а при вызове int 21 код вообще уходит куда-то в глубь памяти, допустим код:
Assembler
1
2
3
4
mov ah,9
mov dx,10d
int 21
xor ax,ax     ;вот, пример. По идее за int 21 идёт xor, но чтобы до xor добраться надо нажать раз 10 ф1!
Так вот меня и интересует в какие это дебри уходит код выполнения проги при нажатии F1?
Тоесть у меня появился интерес не тупо жать раз 10-ть F1, и ждать, пока выполнение вернётся в данный код проги, а ещё и вникнуть, куда это ход выполнения уходит?
Или дайте плиз ссылку, где конкретно и толково разьясняется это. Хочется пошагово рассмотреть это прерывание с подробным описанием, тоесть все промежуточные коды, push, pop, cmp, les какой-то появляется в прерывании!
Не знаю, может это и бессмысленный вопрос с точки зрения опытного программёра, но ведь понимание приходит после разглядения вопроса с разных точек зрения!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2010, 02:21
Ответы с готовыми решениями:

Отладка приложения
Здравствуйте. Подскажите, как можно в Eclipce или AndroidStudio получить список поочередно...

Отладка приложения в эмуляторе
1. Какой отладчик можно подключить и как подключить к приложению запущенному в эмуляторе среды...

Отладка приложения в Лазарус
пока писал прогу, та росла и ширилась. ошибок нету. и вот написал процедуру, с несколькими...

Отладка приложения IronLanguages
Привет, Пытаюсь отладить приложение IronLanguages, инструмент IronStudio для поддержки языка...

7
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
13.07.2010, 11:51 2
Обработчики прерываний
Когда в реальном режиме выполняется команда INT, управление передается по адресу, который считывается из специального массива, таблицы векторов прерываний, начинающегося в памяти по адресу 0000h:0000h. Каждый элемент этого массива представляет собой дальний адрес обработчика прерывания в формате сегмент:смещение или 4 нулевых байта, если обработчик не установлен. Команда INT помещает в стек регистр флагов и дальний адрес возврата, поэтому, чтобы завершить обработчик, надо выполнить команды popf и retf или одну команду iret, которая в реальном режиме полностью им аналогична.

Добавлено через 32 секунды
Программное прерывание — синхронное прерывание, которое может осуществить программа с помощью специальной инструкции.

В процессорах архитектуры x86 для явного вызова синхронного прерывания имеется инструкция Int, аргументом которой является номер прерывания (от 0 до 255). В IBM PC-совместимых компьютерах обработку некоторых прерываний осуществляют подпрограммы BIOS, хранящиеся в ПЗУ, и это служит интерфейсом для доступа к сервису, предоставляемому BIOS. Также, обслуживание прерываний могут взять на себя BIOS карт расширений (например, сетевых или видеокарт), операционная система и даже обычные (прикладные) программы, которые постоянно находятся в памяти во время работы других программ (т. н. резидентные программы). В отличие от реального режима, в защищённом режиме x86-процессоров обычные программы не могут обслуживать прерывания, эта функция доступна только системному коду (операционной системе).

MS-DOS использует для взаимодействия со своими модулями и прикладными программами прерывания с номерами от 20h до 3Fh (числа даны в шестнадцатеричной системе счисления, как это принято при программировании на языке ассемблера x86). Например, доступ к основному множеству функций MS-DOS осуществляется исполнением инструкции Int 21h (при этом номер функции и её аргументы передаются в регистрах). Это распределение номеров прерываний не закреплено аппаратно и другие программы могут устанавливать свои обработчики прерываний вместо или поверх уже имеющихся обработчиков, установленных MS-DOS или другими программами, что, как правило, используется для изменения функционала или расширения списка системных функций. Также, этой возможностью пользуются вирусы.

Добавлено через 57 секунд
прерывания 10,16 - это BIOS
прерывание 21 - это MS-DOS
1
65 / 65 / 1
Регистрация: 14.04.2010
Сообщений: 170
13.07.2010, 12:36  [ТС] 3
Отличнейшее пояснение! Благодарю.
Есть вопрос, который также упомянулся в прерывании и который меня очень интересует. Про реальный и защищённый режимы, тоесть про адресацию памяти. Так как я всего лишь недавно начал изучать Ассемблер, этот вопрос хотелось бы разобрать по песчинке. Согласен, что многое зависит от самостоятельной работы, но при отдельном изучении этой темы, не с помощью книг по Ассемблеру, а с помощью отдельных тем про адресацию столкнулся с небольшими трудностями. Приходится, естественно вникать в весь код Ассемблера, чтобы понять.
Так вот, напишите плиз как-бы простыми словами, не заумными, по простому, как вы понимаете защищённый режим. Немного путанница у меня в этих режимах - реальном и защищённом. Семантику можно? этих понятий. Своими словами. Если можно, то желательно с примерами из жизни, типа таких как ниже
Представьте себе деревянную доску, длинной в 8 бутылок пива и шириной в одну. (В принципе, доску эту можно и в два раза длиннее представить, но тогда на ней надо "DX" написать, мы же пока только "DL" напишем)
Тоесть здесь 8 бутылок это само собой понятно имеется ввиду 8 бит! Тоесть я имею ввиду для более лучшего понимания можно? - типа такого пояснения?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
13.07.2010, 20:06 4
попробую объяснить защищенный режим извини на примере бутылок не умею)). В реальном режиме (правильнее - режиме реальных адресов) ты пишешь в сегментный регистр цифру, в любой другой другую цифру и получаешь реальный адрес по формуле: seg_reg*16+other_reg. В защищенном режиме ты не можешь так просто получить доступ к любому адресу памяти(все защищено). Ты пишешь в сегментный регистр индекс в таблице дескрипторов(вот тут точно на бутылках не объяснить))). Таблица дескрипторов это простой массив 8-ми байтных записей. В каждой этой записи описывается реальный адрес, предел(размер), права доступа к сегменту. Про таблицу прерываний и страничную адресацию лучше не говорить - если интересно - материала море, начиная с интел мануал, главное - все это (защита) в процессорах intel поддерживается аппаратно.

Добавлено через 1 минуту
а вообще если ты недавно узнал че такое ассемблер, лучше не трогать защищенный режим))
1
65 / 65 / 1
Регистрация: 14.04.2010
Сообщений: 170
13.07.2010, 20:26  [ТС] 5
Премного благодарен!!! Да! тут без пива не разберёшся в защищённом режиме! Если честно, не хотел сильно заострять внимание на бутылках. То я привёл пример коммента. Согласен, что надо сначало хотябы в режиме реальных адресов разобраться, хотя по немногу уже вникаю, но не в этом дело! Думаю проблема решима с немногим фанатизмом, полюбому.
0
65 / 65 / 1
Регистрация: 14.04.2010
Сообщений: 170
07.08.2010, 18:20  [ТС] 6
Ещё раз здравствуйте. Почему при просмотре из под отладчика кода, который ниже, IP не возвращается на тот адрес, который идёт после int 21h ? Возьмём к примеру код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CSEG segment
org 100h
 
Begin:
mov ah,9
mov dx,offset Mess
int 21h                      ; тоесть при нажатии F1 код не возвращается на сл-щую строку
 
mov ah,10h               ; нажимал наверно раз 30 F1 :) 
int 16h
 
int 20h
 
Mess db 'Hello world!$'
 
CSEG ends
end Begin
Тость меня интересует такое. Куда это уходит ход выполнения проги? По идее ведь после вызова int 21h прерывание должно обработать код, тоесть вывести строку на экран и вернуться на mov ah,10h int 16h. Я случайно не натворил в памяти глупостей? Может вызвал какое-то прерывание не нужное при нажатии F1 раз 30. Я конечно мог нажать допустим в AFDPRO F2 и IP сразу бы перешло на сл-щую строку. Уже по немногу изучаю тему перехвата прерываний, но есть некоторые нюансы непонятные.
Допустим IP в отладчике стоит на строке int 21h в вышеприведённом коде. При нажатии F1 вызывается прерывание,
1) IP сразу стаёт 107С.
2) в стеке сразу сохранились 4 значения: адрес возврата после int 21h, флаги - 3000, и какие-то не понятные значения - 0АС6 и 42BD.
3) это сначало вызывается оригинальный обработчик?
4) по этому адресу 107С идёт такое: NOP NOP потом CALL 1161. Что тогда этот CALL вызывает? Какой ещё обработчик?
Просветите пожалуйста эти вопросы, которые по пунктам разбиты.

Добавлено через 50 минут
Про функцию 25 и 35 я уже знаю прерывания 21. Но немного не понятно про оригинальные обработчики!

Добавлено через 20 минут
Тоесть как я уже отмечал, при нажатии F1 раз 30 не встретилась команда IRET для восстановления IP
0
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
07.08.2010, 22:07 7
еще раз читайте как работает int у вас сменился CS:IP при прерывании, посмотрите таблицу векторов
1) IP сразу стаёт 107С.

обработчик int 21h, хотя тут неизвестно как работает отладчик в TD Я попадаю на sti команду, возможно adfpro прерывания подменяет на свои процедуры
4) по этому адресу 107С идёт такое: NOP NOP потом CALL 1161. Что тогда этот CALL вызывает?
0
65 / 65 / 1
Регистрация: 14.04.2010
Сообщений: 170
08.08.2010, 03:06  [ТС] 8
--еще раз читайте как работает int у вас сменился CS:IP при прерывании, посмотрите таблицу векторов
У Калашникова нет, как работает именно int ! Тоесть я не хочу сказать, про уважаемого Калашникова, что про int нет ни чего! Это глупо.! Та и я знаю что (вообщето я сам такой) что многие за него пойдут горой. Я и сам знаю, что у меня сменился CS:IP. Посмотреть таблицу! А где её посмотреть? Можно? конкретно.
Есть информация, что отладчик глючит! Тоесть не встречает команду IRET для восстановления IP.
отладчик в TD Я попадаю на sti команду - и про это можно? немного конкретики, семантики

Добавлено через 20 минут
Даже читал статьи для дZенствующих . Про векторы конкретно ни чего нет!

Добавлено через 2 минуты
Или посоветуйте пожалуйста уважаемые, куда мне влезть? на правильный путь, чтобы узнать конкретно про эти прерывания!
0
08.08.2010, 03:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2010, 03:06
Помогаю со студенческими работами здесь

Отладка многопроектного приложения
Добрый день. Есть программа (18 проектов). Один отмечен как стартовый. В отладку вхожу только в...

Отладка стороннего приложения
Всем привет! Давно интересует такой вопрос, долго искал в интернете ответ на него, но всё четно....

Valgrind и отладка приложения
Необходимо отладить приложение. Во время работы (при компиляции в режиме отладки) приложение грузит...

Отладка многопоточного приложения
Читаю РИхтера, пытаюсь выполнить его примеры, хотелось бы зайти в отладчик и посмотреть, что там...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru