Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> msvc2008 bug??? 
:(
    Опции темы
GoldFinch
Дата 6.12.2008, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Код

#include "stdafx.h"

__declspec(naked) int Foo(int arg)
{__asm{
    _emit 0xCC
    mov eax,[arg]
    ret
}};

int _tmain(int argc, _TCHAR* argv[])
{
    return Foo(1);
}

Код

00401000  /$  CC            INT3
00401001  |.  8B45 08       MOV EAX,DWORD PTR [EBP+8]                ;<<<<< ebp o_O
00401004  \.  C3            RETN
00401005      CC            INT3
...
0040100F      CC            INT3
00401010  /$  6A 01         PUSH 1
00401012  |.  E8 E9FFFFFF   CALL cpp_asm_.00401000
00401017  |.  83C4 04       ADD ESP,4
0040101A  \.  C3            RETN

это баг или "фича"? о_О
PM MAIL ICQ   Вверх
Kallikanzarid
Дата 6.12.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



А что ты ожидал? В ebp хранится указатель на фрейм:
http://en.wikipedia.org/wiki/Frame_pointer
PM MAIL   Вверх
GoldFinch
Дата 6.12.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Kallikanzarid, фрейма нету, какбэ
читай код в 1м посте полностью
PM MAIL ICQ   Вверх
MAKCim
Дата 6.12.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



GoldFinch, 
хм, реально баг получается



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kallikanzarid
Дата 6.12.2008, 20:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Точно, должно быть esp  smile 
Попробуй поставить сервис пак, может, поможет.
PM MAIL   Вверх
J0ker
Дата 7.12.2008, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



все верно
в прологе esp сохраняется в ebp, и от ebp считаются аргументы
так что все правильно
неправильно в naked использовать аргумент - т.к. компайлер плюет, что вы отказались от пролога и эпилога


--------------------
user posted image
PM MAIL   Вверх
dumb
Дата 7.12.2008, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



хм. здесь про аргументы ничего такого не сказано, однако упомянуто авто-отключение Frame pointer optimization для naked функций. т.е. компилер рассчитывает на то, что руками фрэйм таки будет создан, что он и демонстрирует.
PM MAIL   Вверх
Kallikanzarid
Дата 7.12.2008, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



GoldFinch, Если нет желания использовать фрейм, попробуй __fastcall. ЕМНИП, два двойных слова ты с его помощью без проблем передашь даже без фрейма. В принципе можно одним из них передавать указатель на объект, в котором хранятся остальные параметры.

Это сообщение отредактировал(а) Kallikanzarid - 7.12.2008, 08:54
PM MAIL   Вверх
J0ker
Дата 7.12.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



ну прям лень фрейм выставить - 2 инструкции в начале и 2 в конце


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 7.12.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Kallikanzarid, в msdn сказано что при __fastcall компилятор не гарантирует очередность параметров, т.е. неизвестно какой окажется в eax а какой edx. Кроме того, в большинстве случаев аргументы лежат в стеке.

J0ker, я привык к тому что когда я пишу на асме, я пишу как я хочу, а не так как того хочет конпилятор. может у меня ограничения на длину кода, мне тогда этот фрейм впихнуть некуда, более того, он в ряде случаев просто не нужен.

PM MAIL ICQ   Вверх
Kallikanzarid
Дата 7.12.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



GoldFinch, Если бы ты писал под мобильники, то юзал бы явно не студию. Уменьшение размера кода даже на килобайт абсолютно незаметно. Теоретик, блин smile

ЗЫ: Зачем тебе нужны naked функции?

Кстати, если тебе так противен фрейм, можешь спокойно высчитывать расположение параметров сам.

Это сообщение отредактировал(а) Kallikanzarid - 7.12.2008, 14:28
PM MAIL   Вверх
GoldFinch
Дата 7.12.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Kallikanzarid, если бы ты писал на асме, ты бы знал зачем надо уменьшать код, зачем нужны naked функции
высчитывать расположение параметров самому глупо, этим должен заниматься компилятор, тем более что это асм встроенный в ЯВУ
PM MAIL ICQ   Вверх
Kallikanzarid
Дата 7.12.2008, 15:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Цитата

если бы ты писал на асме, ты бы знал зачем надо уменьшать код, зачем нужны naked функции

О да, я такой глупый, просто оторопь берет!  smile Не желаю экономить 10 байт на функцию - просто кошмар!

Ты хоть профилировщик запускал прежде, чем прибегать к таким мерам? Или тебе 4мб L2-кэша заранее мало?

Цитата

высчитывать расположение параметров самому глупо, этим должен заниматься компилятор

Писать пролог самому глупо, этим должен заниматься компилятор.

ЗЫ:
Цитата

при __fastcall компилятор не гарантирует очередность параметров, т.е. неизвестно какой окажется в eax а какой edx.

А тебе зачем это знать? Обращайся к параметрам по имени.
PM MAIL   Вверх
GoldFinch
Дата 7.12.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Kallikanzarid, вот есть у меня например такой код:
Код

__declspec(naked) ttt func(...) {__asm jmp $+5 __asm nop __asm push rva __asm call imp_core }

__declspec(naked) void imp_core(int rva)
//make import
{ __asm{
    //_emit 0xCC
    pop eax // =func+0x10
    pop edx // =rva
    add edx,[g_hCore] // = VA
    push edx
    sub edx,eax //=org_func-(func+0x10)
    add edx,0x10-5 //=org_func-(func+5)
    mov [eax-0x10+1],edx
    ret
}}

куда здесь воткнуть ebp фреймы?
PM MAIL ICQ   Вверх
Kallikanzarid
Дата 7.12.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Боюсь даже представить smile А что делает этот код?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

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

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.