![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Регистрация: 04.01.2012
Сообщений: 5
|
![]()
Пытаюсь понять логику работы одной программы: наткнулся на строки и не могу до конца понять, что они делают:
fld ds:tbyte_401EB8 mov edx, esi shl edx, 5 fmul [ebp+var_7C] lea edx, [edx+edx*4] lea edx, [edx+edx*4] lea edx, [edx+edx*4] mov [ebp+var_AC], edx fild [ebp+var_AC] fcompp fnstsw ax // fnstsw что делает? ( про fstsw нашел) sahf jbe short loc_401E45 и другой блок: fld ds:tbyte_401EB8 fmul [ebp+var_7C] fcomp ds:flt_401EC4 fnstsw ax sahf jbe short loc_401E45 |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 10.08.2013
Сообщений: 67
|
![]()
А что сложного? Или работу сопроцессора не изучали?
fld ds:tbyte_401EB8; берем константу или глобальную переменную(на вершину FPU стека) mov edx, esi; берем двойное слово shl edx, 5; умножаем на 32, теряя 5 старших бит fmul [ebp+var_7C]; умножаем верхушку стека(tbyte_401EB8) на локальную переменную(float) lea edx, [edx+edx*4];дополнительная возня с edx lea edx, [edx+edx*4] lea edx, [edx+edx*4] mov [ebp+var_AC], edx; сохраняем в локальной переменной fild [ebp+var_AC];чтобы загрузить тут же загрузить на верхушку стека, преобразовав int во float fcompp; сравниваем var_AC с тем, что было fnstsw ax; сохраняем регистр флагов сопроцессора(без проверки на отложенные прерывания - отличие от fstsw ax) sahf; отображаем на EFLAGS jbe short loc_401E45; FPU C0 = EFLAGS CF, FPU C3 = EFLAGS ZF(jbe проверяет ZF и CF) на Си можно перевести так: double tbyte_401EB8 = 1.0; { unsigned long _edx = esi; float var_7C = 10.0f; _edx *= 32; _edx += _edx*4; _edx += _edx*4; _edx += _edx*4; if( (double)(var_7C * tbyte_401EB8) > (double) _edx ) { ... } _loc_401E45: } По аналогии: fld ds:tbyte_401EB8 fmul [ebp+var_7C] fcomp ds:flt_401EC4 fnstsw ax sahf jbe short loc_401E45 double tbyte_401EB8 = 1.0; double flt_401EC4 = 2.0; { float var_7C = 10.0f; if((double)(tbyte_401EB8 * var_7C) > (double)flt_401EC4) { ... } _loc_401E45: } |
![]() |
![]() |
![]() |
#3 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
![]() Код:
А суммарно там edx на 4000 умножается. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Подскажете, что этот скрипт делает? | ROD | JavaScript, Ajax | 0 | 11.10.2011 12:51 |
Что делает этот скрипт? | ROD | JavaScript, Ajax | 4 | 29.10.2010 12:54 |
Что делает этот код? | Alex_sim | Общие вопросы C/C++ | 10 | 03.03.2010 23:45 |
Что делает этот код? | lucky | Общие вопросы Delphi | 4 | 17.06.2009 17:02 |
Что делает этот while do? | Levhik | Общие вопросы C/C++ | 4 | 25.01.2009 17:27 |