Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2013, 22:18   #1
vik112358
 
Регистрация: 04.01.2012
Сообщений: 5
По умолчанию Что делает этот блок кода на Assembler'e

Пытаюсь понять логику работы одной программы: наткнулся на строки и не могу до конца понять, что они делают:

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
vik112358 вне форума Ответить с цитированием
Старый 25.08.2013, 00:36   #2
asmprog
Пользователь
 
Регистрация: 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:

}
asmprog вне форума Ответить с цитированием
Старый 31.08.2013, 01:42   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Код:
lea edx, [edx+edx*4]
Это всего лишь умножение edx на 5
А суммарно там edx на 4000 умножается.
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажете, что этот скрипт делает? 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