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

Поиск:

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


любитель
****


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

Репутация: 79
Всего: 250



Цитата(GoldFinch @  8.12.2008,  20:56 Найти цитируемый пост)

а это не решение? о_О
pushd     [esp+18h+arg_4]
pushd     [eax+4]


битовое представление floata равного n не  не соответствует битовому представлению этого числа в dword/int (дополненого нулями)


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 8.12.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GoldFinch @ 8.12.2008,  20:56)
Цитата(J0ker @  8.12.2008,  20:50 Найти цитируемый пост)
других решений тут нет и быть не может 

а это не решение? о_О
pushd     [esp+18h+arg_4]
pushd     [eax+4]
call    FCanvasUtil::DrawLine(float,float,float,float,FColor,int)

нет


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



****


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

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



mes, я струдом догадываюсь что такое битовое представление, тем более дополненное нулями О_о, и причем тут это
команда push [mem32] копирует 4 байта по адресу mem32 в стек, и она не обращает внимания на "битовое представление" этих байт.
J0ker, и в каком же месте это не решение?

Это сообщение отредактировал(а) GoldFinch - 8.12.2008, 21:22
PM MAIL ICQ   Вверх
J0ker
Дата 8.12.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GoldFinch @  8.12.2008,  21:21 Найти цитируемый пост)
J0ker, и в каком же месте это не решение?

в месте преобразования типа - размещение значений с плавающей точкой в памяти и обратная операция сопряжено с преобразованием типов
нельзя корректно положить на стек число с плавающей точкой иначе чем через стек FPU


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


любитель
****


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

Репутация: 79
Всего: 250



Цитата(GoldFinch @  8.12.2008,  21:21 Найти цитируемый пост)
mes, я струдом догадываюсь что такое битовое представление,

сейчас набросаю пример почему не явлется решением :

Цитата(GoldFinch @  8.12.2008,  21:21 Найти цитируемый пост)
копирует 4 байта по адресу mem32 в стек, и она не обращает внимания на "битовое представление" этих байт.


Добавлено @ 21:33
вот примерно что получится в результате вашго решения :
Код

#include <iostream>

union convert
{
    float f;
    int i;
};

int main()
{
   convert c;
   c.i =5;
   std::cout<<c.i<<std::endl;
   ++c.f;
   std::cout<<c.i<<std::endl;

  system("pause");
  return 0;
}



Это сообщение отредактировал(а) mes - 8.12.2008, 21:35


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 8.12.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



J0kermes, жжоте... какие громкие заявления) какая уверенность в правоте своих слов... вы не правы. 
Потому что черное это черное, а белое это белое. Есть много способов премещать значения в памяти, и если вы этого не знаете это не значит что эти способы неверны) Курите документацию к процу и вам откроется истина)

Но какие замечательные высказывания от вроде бы малость разбирающихся в программировании людей... Записал бы, да бред не коллекционирую.

upd:
mes, нет, Ваш код ниразу не соответствует той ситуации.

Это сообщение отредактировал(а) GoldFinch - 8.12.2008, 21:43
PM MAIL ICQ   Вверх
mes
Дата 8.12.2008, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(GoldFinch @  8.12.2008,  21:39 Найти цитируемый пост)
какие громкие заявления)

никакой громкости.. Вам был представлен пример, который показывает что участок памяти трактованный как int, числено не равен этому же участку памяти но трактованному как float.
жаль что Вы даже не захотели этого понять ;)

Цитата(GoldFinch @  8.12.2008,  21:39 Найти цитируемый пост)
Потому что черное это черное, а белое это белое.

И ночью тоже ?

Цитата(GoldFinch @  8.12.2008,  21:39 Найти цитируемый пост)
Есть много способов премещать значения в памяти, и если вы этого не знаете это не значит что эти способы неверны) 

а кто нибудь оспаривал ? речь не о перемещении а о трактовке значения.

Цитата(GoldFinch @  8.12.2008,  21:39 Найти цитируемый пост)
Записал бы, да бред не коллекционирую. 

А вот это действительно громко. Записал бы, но .... я думаю Вы догадались )





--------------------
PM MAIL WWW   Вверх
J0ker
Дата 8.12.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



так..... тут было потерто обкидывание оппонента какашками  smile 

Это сообщение отредактировал(а) J0ker - 8.12.2008, 22:20


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


любитель
****


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

Репутация: 79
Всего: 250



Цитата(GoldFinch @  8.12.2008,  21:39 Найти цитируемый пост)
mes, нет, Ваш код ниразу не соответствует той ситуации.


Цитата(J0ker @  8.12.2008,  21:20 Найти цитируемый пост)
pushd     [esp+18h+arg_4]
pushd     [eax+4]
call    FCanvasUtil::DrawLine(float,float,float,float,FColor,int)

вот немного изменил код, чтоб легче было понимать что происходит .. желаю приятных эксперементов :
Код


#include <iostream>

union convert
{
    float f;
    int i;
};

float mycast_int2float(int i) // преобразование без учета типа
{
    convert c;
    c.i = i;
    return c.f;
}

void myfunc (float f)
{
    std::cout<< "argument for myfunc = " << f << std::endl;
}

int main()
{
// передача аргумента с  конвертацией типа
  myfunc ('a'); // char
  myfunc (int(5)); // int
  myfunc (6);    // int
  myfunc (7.0); // double
// передача аргумента по битовому представлению
  myfunc (mycast_int2float('a'));
  myfunc (mycast_int2float(5));

  system("pause");
  return 0;
}




--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 8.12.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



mes, что за бредовый пруфкод вы пишете? то что мы обсуждаем выглядит так:
Код

#include <windows.h>
#pragma comment(linker,"/ENTRY:main")

int __stdcall Foo(float arg)
{
    return arg == 8/7;
};

int Bar(float arg)
{__asm{
    push dword ptr [arg]
    call Foo
}};

void main()
{    
    if ( Bar(8/7)) 
        MessageBoxA(0,"8//7==8//7","ok",0);
    else
        MessageBoxA(0,"8//7!=8//7",0,0);
}

в строчке "push dword ptr [arg]" float значение передается в стек через push а не через пару fld/fstp
что характерно прога выводит "8/7==8/7"

Это сообщение отредактировал(а) GoldFinch - 8.12.2008, 22:20
PM MAIL ICQ   Вверх
J0ker
Дата 8.12.2008, 22:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, я вам объясняю... совершенно спокойно, вот...
преобразование из дабл во флоат - это ОПЕРАЦИЯ - она не может быть выполнена без привлечения FPU либо его эмулятора
если вы в своих примерах замените float на double вы сразу это поймете


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


любитель
****


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

Репутация: 79
Всего: 250



Цитата(GoldFinch @  8.12.2008,  22:17 Найти цитируемый пост)
int Bar(float arg)

A Вы схитрили .. перепешите код изменив эту срочку на
int Bar(int arg)

вот Вам каркас теста :
Код


#include <iostream>

int __stdcall Foo(float arg)
{
    return int(arg)+1;
};
int Bar( int arg)
{
    Foo (arg); // вот вместо этого  передайте параметр через стек  )
};
int main()
{
 std::cout << "Foo(5) = " << Bar(5)<<std::endl;

  system("pause");
  return 0;
}


потом еше можете изменить int на double и посмотреть результат ) 

Это сообщение отредактировал(а) mes - 8.12.2008, 22:36


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 8.12.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, вот, разберитесь уже наконец
Код

__declspec(noinline) float foo(float x, float x1)
{
    return x * x1;
00401650  fld         dword ptr [esp+4] 
00401654  fmul        dword ptr [esp+8] 
00401658  fstp        dword ptr [esp+4] 
0040165C  fld         dword ptr [esp+4] 
}
00401660  ret              

..............

__declspec(noinline) double foo1(double x, double x1)
{
    return x * x1;
00401670  fld         qword ptr [esp+4] 
00401674  fmul        qword ptr [esp+0Ch] 
}
00401678  ret              

..................

int _tmain(int argc, _TCHAR* argv[])
{
00401680  push        ebp  
00401681  mov         ebp,esp 
00401683  and         esp,0FFFFFFC0h 
00401686  push        0FFFFFFFFh 
00401688  push        403A20h 
0040168D  mov         eax,dword ptr fs:[00000000h] 
00401693  push        eax  
00401694  sub         esp,70h 
00401697  mov         eax,dword ptr ds:[00406018h] 
0040169C  xor         eax,esp 
0040169E  mov         dword ptr [esp+38h],eax 
004016A2  push        esi  
004016A3  mov         eax,dword ptr ds:[00406018h] 
004016A8  xor         eax,esp 
004016AA  push        eax  
004016AB  lea         eax,[esp+78h] 
004016AF  mov         dword ptr fs:[00000000h],eax 
004016B5  mov         esi,dword ptr [ebp+0Ch] 
    float a = (float)atof(argv[1]);
004016B8  mov         eax,dword ptr [esi+4] 
004016BB  push        eax  
004016BC  call        dword ptr ds:[00404108h] 
004016C2  fstp        dword ptr [esp+34h] 
    float b = (float)atof(argv[2]);
004016C6  mov         ecx,dword ptr [esi+8] 
004016C9  add         esp,4 
004016CC  push        ecx  
004016CD  call        dword ptr ds:[00404108h] 
    
    float y = foo(a, b) * 4.7f;
004016D3  fstp        dword ptr [esp+38h] 
004016D7  fld         dword ptr [esp+38h] 
004016DB  fstp        dword ptr [esp] 
004016DE  push        ecx  
004016DF  fld         dword ptr [esp+38h] 
004016E3  fstp        dword ptr [esp] 
004016E6  call        00401650 
004016EB  fmul        qword ptr ds:[00404650h] 

    double a1 = atof(argv[1]);
004016F1  mov         edx,dword ptr [esi+4] 
004016F4  push        edx  
004016F5  fstp        dword ptr [esp+3Ch] 
004016F9  call        dword ptr ds:[00404108h] 
    double b1 = atof(argv[2]);
004016FF  mov         eax,dword ptr [esi+8] 
00401702  fstp        qword ptr [esp+40h] 
00401706  add         esp,0Ch 
00401709  push        eax  
0040170A  call        dword ptr ds:[00404108h] 

    double y1 = foo1(a1, b1) * 4.7;
00401710  sub         esp,0Ch 
00401713  fstp        qword ptr [esp+8] 
00401717  fld         qword ptr [esp+44h] 
0040171B  fstp        qword ptr [esp] 
0040171E  call        00401670 
00401723  fmul        qword ptr ds:[00404648h] 
00401729  add         esp,10h 

    return (int)(y + y1);
0040172C  fadd        dword ptr [esp+30h] 
00401730  call        00403500 
}
00401735  mov         ecx,dword ptr [esp+78h] 
00401739  mov         dword ptr fs:[00000000h],ecx 
00401740  pop         ecx  
00401741  pop         esi  
00401742  mov         ecx,dword ptr [esp+38h] 
00401746  xor         ecx,esp 
00401748  call        00401F58 
0040174D  mov         esp,ebp 
0040174F  pop         ebp  
00401750  ret              



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



****


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

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



J0ker
Код

.text:10001344                 fld     [esp+18h+arg_4]
.text:10001348                 fstp    [esp+18h+var_14]
.text:1000134C                 fld     dword ptr [eax+4]
.text:1000134F                 fstp    [esp+18h+var_18]
.text:10001352                 call    FCanvasUtil::DrawLine(float,float,float,float,FColor,int)

где Вы тут увидели double??? тот самый 64-разрядный double, а не 32-разрядный float?? надеюсь Вы понимаете что мы говорим о 32(тридцатидвух)-разрядных значениях??

но специально для Вас, я перепишу код для double, и даже уберу там баги которых Вы не заметили)))
Код

#include <windows.h>
#pragma comment(linker,"/ENTRY:main")

__declspec(noinline) int __stdcall Foo(double arg)
{
    return arg == 8.0/7.0;
};
 
__declspec(noinline) int __stdcall Bar(double arg)
{__asm{
    push dword ptr [arg+4]
    push dword ptr [arg]
    call Foo
}};

void main()
{    
    if ( Bar(8.0/7.0)) 
        MessageBoxA(0,"8/7==8/7","ok",0);
    else
        MessageBoxA(0,"8/7!=8/7",0,0);
}

какбэ 64-разрядные значения запихиваются в стек двумя push [mem32]

более того, пиши я под x64, там был бы один push [mem64]

Добавлено @ 22:44
J0ker, Вас в вашем коде строчки
00401658  fstp        dword ptr [esp+4] 
0040165C  fld         dword ptr [esp+4] 
не смущают?
и вообще, как эта муть относится к теме?


mes, медленно, вдумчиво, прочитайте еще раз этот код, и Вы поймете что Вы пишите не по теме.
.text:10001344                 fld     [esp+18h+arg_4]
.text:10001348                 fstp    [esp+18h+var_14]
.text:1000134C                 fld     dword ptr [eax+4]
.text:1000134F                 fstp    [esp+18h+var_18]
.text:10001352                 call    FCanvasUtil::DrawLine(float,float,float,float,FColor,int)
ну нету в этом коде ничего связанного с int, не-ту

Это сообщение отредактировал(а) GoldFinch - 8.12.2008, 22:48
PM MAIL ICQ   Вверх
J0ker
Дата 8.12.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GoldFinch @  8.12.2008,  22:39 Найти цитируемый пост)
о специально для Вас, я перепишу код для double, и даже уберу там баги которых Вы не заметили)))

да я собстна не про этот код  smile 
я его даже не читал

Цитата(GoldFinch @  8.12.2008,  22:39 Найти цитируемый пост)
J0ker, Вас в вашем коде строчки
00401658  fstp        dword ptr [esp+4] 
0040165C  fld         dword ptr [esp+4] 
не смущают?

а вас смущает? а что вас смущает?  smile 

Цитата(GoldFinch @  8.12.2008,  22:39 Найти цитируемый пост)
и вообще, как эта муть относится к теме?

когда вы это поймете, дискуссия будет окончена  smile 


--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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