OSDev

для всех
Текущее время: 14 дек 2019, 16:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: 14 май 2011, 16:08 

Зарегистрирован: 18 апр 2010, 15:59
Сообщения: 155
Ситуация такая:

Исходник №1:
...
__asm call KernelInterface::HandleRtSysCall ;
...

Исходник №2:
VOID KernelInterface::HandleRtSysCall(InterruptScope* CONST interruptScope)
{
; // здесь только инструкция ret;
}

на выходе исключение при исполнении инструкции ret;

анализ стека показал, что call KernelInterface::HandleRtSysCall не поместил в стек адрес возврата. Да-да, именно не поместил туда вообще никакого адреса, как при простом jmp.

Причем компилятор сгенерировал для call-а следующий код "E8 58 02 00 00", что вроде как нормальный код для инструкции call.

Причем если ручками запихивать на стек код возврата:
...
__asm push EXIT ;
__asm call KernelInterface::HandleRtSysCall ;

то все работает гуд.

Что вы думаете по этому поводу?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2011, 11:25 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
то что перед ret надо восстанавливать указатель стека..
чтото типо:

Код:
leave
ret


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2011, 12:27 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1401
Восстанавливать надо лишь в случае, если он изменялся. Если подпрограмма целиком написана на ЯВУ (Си++ в данном случае), то это является заботой компилятора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2011, 13:15 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
SII писал(а):
Восстанавливать надо лишь в случае, если он изменялся. Если подпрограмма целиком написана на ЯВУ (Си++ в данном случае), то это является заботой компилятора.

но он же делает ret, а не компилятор? или я чтото не так понял?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2011, 16:36 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1401
А фиг его знает. Я лично предположил, что компилятор, и что вся подпрограмма из одного только ret и состоит... А вот если сам, тогда могут быть проблемы, если компилятор настолько туп (или если оптимизация выключена, или ещё что), что сгенерировал код для формирования кадра стека без реальной на то нужды.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2011, 16:57 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
SII писал(а):
А фиг его знает. Я лично предположил, что компилятор, и что вся подпрограмма из одного только ret и состоит... А вот если сам, тогда могут быть проблемы, если компилятор настолько туп (или если оптимизация выключена, или ещё что), что сгенерировал код для формирования кадра стека без реальной на то нужды.

попробуй смотреть что он генерит через -save-temps


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2011, 18:06 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1401
Так не у меня ж проблема :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2011, 18:37 

Зарегистрирован: 18 апр 2010, 15:59
Сообщения: 155
Товарищи, спасибо конечно за активность, но пост был за 14 мая. И даже я, автор этого поста, уже не помню ни сути проблемы ни ее решения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 сен 2011, 19:02 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1401
Гы :) самого главного мы и не заметили :)))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 сен 2011, 09:16 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
ZarathustrA писал(а):
Товарищи, спасибо конечно за активность, но пост был за 14 мая. И даже я, автор этого поста, уже не помню ни сути проблемы ни ее решения.

вопрос не властен во времени.. тема была открыта.. ответов не было.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB