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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2011, 08:31   #1
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
Вопрос Что за команды???

Для чего эта? Что она делает?
Код:
fcompp
и
эта

Код:
fcomp
VintProg вне форума Ответить с цитированием
Старый 12.08.2011, 08:38   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Хм, мучают подозрения что это команды математического сопроцессора.
К счастью, под рукой есть "Ассемблер и дизассемблирование", вот нашёл там:
Цитата:
FCOMP - сравнение вещественного числа в ST(0) с операндом с выталкиванием ST(0) из стека. Операнд может быть регистром и областью памяти.
Цитата:
FCOMPP - Сравнение ST(0) и ST(1) с двойным выталкиванием из стека.
И ещё вот подобная
Цитата:
FICOMP - Сравнение целых чисел в ST(0) с операндом. Операнд может быть 16- или 32-битной областью памяти или регистром. При выполнении операции происходит выталкивание ST(0) из стека.
А вообще, вас что, в гугле забанили?
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.08.2011, 08:55   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

VintProg
а еще есть fcom -- сравнение вещественных чисел ”COMPARE Floating point values” и вариации с выталкиванием из стека FPU (fcomp, fcompp)
ficom (ficomp) -- сравнивается содержимое регистра ST(0) и 16- или 32-битной переменной, считая что в SRC содержится целое число. В остальном команды FICOM/FICOMP эквивалентны командам FCOM/FCOMP/FCOMPP
fucom (fucomp, fucompp) -- сравнение вещественных чисел без учета порядка ”Unordered COMPARE Floating point values”
При сравнении командами fcom/ficom/fucom используются флаги состояния C3, C2 и C0 в FPU и команды FSTSW, SAHF, POPF
Команды FCOMI, FCOMIP, FUCOMI, FCOMIP появились в процессорах P6 и позволяют напрямую заносить результаты сравнения в регистр EFLAGS, не используя команды FSTSW AX/SAHF
Mikl___ вне форума Ответить с цитированием
Старый 12.08.2011, 10:11   #4
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Вот отрывок кода:

Код:
.text:004C3D5B     loc_4C3D5B:                             ; CODE XREF: _createMarker+D0j
.text:004C3D5B 000                 movzx   eax, ds:_radarBlips.field_24[eax]
.text:004C3D62 000                 fcompp
.text:004C3D64 000                 shl     eax, 10h
.text:004C3D67 000                 or      eax, edx
.text:004C3D69 000                 retn
.text:004C3D69     ; ---------------------------------------------------------------------------
.text:004C3D6A 000                 align 10h
.text:004C3D70
.text:004C3D70     loc_4C3D70:                             ; CODE XREF: _createMarker+25j
.text:004C3D70 000                 or      eax, 0FFFFFFFFh
.text:004C3D73 000                 fcompp
.text:004C3D75 000                 retn
.text:004C3D75     _createMarker   endp
Что в результат передается?
VintProg вне форума Ответить с цитированием
Старый 12.08.2011, 10:35   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

VintProg
Либо fcompp это "мусорный код" либо данные, которые распознались как код. Так как fcompp для сравнения в стек FPU ничего не передавалось, а результат сравнения должен был быть передан из FPU командой FSTSW reg а затем должен быть push reg/popf
Mikl___ вне форума Ответить с цитированием
Старый 12.08.2011, 10:41   #6
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Вот весь код:

Код:
.text:004C3C80     ; int __cdecl createMarker(int type, float x, float y, float z, int flag1, int flag2)
.text:004C3C80     _createMarker   proc near          
.text:004C3C80     type            = dword ptr  4
.text:004C3C80     x               = dword ptr  8
.text:004C3C80     y               = dword ptr  0Ch
.text:004C3C80     z               = dword ptr  10h
.text:004C3C80     flag1           = dword ptr  14h
.text:004C3C80     flag2           = dword ptr  18h
.text:004C3C80 000                 xor     edx, edx
.text:004C3C82 000                 xor     eax, eax
.text:004C3C84 000                 fld     [esp+z]
.text:004C3C88 000                 fld     [esp+y]
.text:004C3C8C 000                 jmp     short loc_4C3C94
.text:004C3C8C     ; 
.text:004C3C8E 000                 align 10h
.text:004C3C90
.text:004C3C90     loc_4C3C90:                 
.text:004C3C90 000                 add     eax, 38h
.text:004C3C93 000                 inc     edx
.text:004C3C94
.text:004C3C94     loc_4C3C94:                             
.text:004C3C94 000                 cmp     ds:_radarBlips.inUse[eax], 0
.text:004C3C9B 000                 jz      short loc_4C3CA2
.text:004C3C9D 000                 cmp     edx, 75
.text:004C3CA0 000                 jb      short loc_4C3C90
.text:004C3CA2
.text:004C3CA2     loc_4C3CA2:                             
.text:004C3CA2 000                 cmp     edx, 75
.text:004C3CA5 000                 jnb     loc_4C3D70
.text:004C3CAB 000                 mov     ecx, edx
.text:004C3CAD 000                 mov     eax, [esp+type]
.text:004C3CB1 000                 imul    ecx, 38h
.text:004C3CB4 000                 fld     [esp+x]
.text:004C3CB8 000                 mov     ds:_radarBlips.type[ecx], eax
.text:004C3CBE 000                 mov     dword ptr ds:_radarBlips.id_color[ecx], 5
.text:004C3CC8 000                 mov     ds:_radarBlips.field_26[ecx], 1
.text:004C3CCF 000                 mov     ds:_radarBlips.inUse[ecx], 1
.text:004C3CD6 000                 mov     ds:_radarBlips.field_28[ecx], 0
.text:004C3CDD 000                 mov     ds:_radarBlips.field_2C[ecx], 3F800000h
.text:004C3CE7 000                 fstp    ds:_radarBlips.pos.x[ecx]
.text:004C3CED 000                 fst     ds:_radarBlips.pos.y[ecx]
.text:004C3CF3 000                 fld     st(1)
.text:004C3CF5 000                 fstp    ds:_radarBlips.pos.z[ecx]
.text:004C3CFB 000                 fld     [esp+x]
.text:004C3CFF 000                 mov     eax, [esp+flag2]
.text:004C3D03 000                 fstp    ds:_radarBlips.field_18.x[ecx]
.text:004C3D09 000                 fst     ds:_radarBlips.field_18.y[ecx]
.text:004C3D0F 000                 fld     st(1)
.text:004C3D11 000                 fstp    ds:_radarBlips.field_18.z[ecx]
.text:004C3D17 000                 mov     ds:_radarBlips.entityHandle[ecx], 0
.text:004C3D21 000                 mov     ds:_radarBlips.field_30[ecx], 1
.text:004C3D2A 000                 mov     ds:_radarBlips.field_32[ecx], ax
.text:004C3D31 000                 mov     eax, edx
.text:004C3D33 000                 imul    eax, 38h
.text:004C3D36 000                 mov     ds:_radarBlips.iconID[ecx], 0
.text:004C3D3F 000                 cmp     ds:_radarBlips.field_24[eax], 0FFFEh
.text:004C3D47 000                 jnb     short loc_4C3D52
.text:004C3D49 000                 inc     ds:_radarBlips.field_24[eax]
.text:004C3D50 000                 jmp     short loc_4C3D5B
.text:004C3D52     
.text:004C3D52
.text:004C3D52     loc_4C3D52:                             
.text:004C3D52 000                 mov     ds:_radarBlips.field_24[eax], 1
.text:004C3D5B
.text:004C3D5B     loc_4C3D5B:                           
.text:004C3D5B 000                 movzx   eax, ds:_radarBlips.field_24[eax]
.text:004C3D62 000                 fcompp
.text:004C3D64 000                 shl     eax, 10h
.text:004C3D67 000                 or      eax, edx
.text:004C3D69 000                 retn
.text:004C3D69     ; ---------------------------------------------------------------------------
.text:004C3D6A 000                 align 10h
.text:004C3D70
.text:004C3D70     loc_4C3D70:                            
.text:004C3D70 000                 or      eax, 0FFFFFFFFh
.text:004C3D73 000                 fcompp
.text:004C3D75 000                 retn
.text:004C3D75     _createMarker   endp
VintProg вне форума Ответить с цитированием
Старый 12.08.2011, 10:43   #7
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Я его в C++ перевести пытаюсь но думаю что-то не то делаю:

Код:
DWORD __cdecl Create_Marker(DWORD type, float x, float y, float z, DWORD flag1, DWORD flag2)
{
DWORD index = 0;


for (int i=0; index < 75; i++)
{
  index = i;


if ( VCRadarBlips[index].inUse == 0)
   {
	   VCRadarBlips[index].typeMarker = type;
	   VCRadarBlips[index].id_color = 5;
	   VCRadarBlips[index].field_26 = 1;
	   VCRadarBlips[index].inUse = 1;
	   VCRadarBlips[index].field_28 = 0;
	   VCRadarBlips[index].field_2C = 0x3F800000;
	   VCRadarBlips[index].pos.x = x;
	   VCRadarBlips[index].pos.y = y;
	   VCRadarBlips[index].pos.z = z;
	   VCRadarBlips[index].field_18 = VCRadarBlips[index].pos;
	   VCRadarBlips[index].entityHandle = 0;
	   VCRadarBlips[index].scale = 1;
	   VCRadarBlips[index].field_32 = flag2;
	   VCRadarBlips[index].iconID = 0;

	   if (VCRadarBlips[index].field_24 <= 0xFFFE)
     	   {
             VCRadarBlips[index].field_24 = 1;
			 return (index >> 0x10);
	       }

	   VCRadarBlips[index].field_24 += VCRadarBlips[index].field_24;

	  return (index >> 0x10);
   }



}

 return (index >> 0x10);
};
VintProg вне форума Ответить с цитированием
Старый 12.08.2011, 11:07   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

((radarBlips.field_24<< 16) | index)

и -1 в случае ошибки (index>75)
f.hump вне форума Ответить с цитированием
Старый 12.08.2011, 11:28   #9
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Теперь этот код значит правильный?

Код:
DWORD __cdecl Create_Marker(DWORD type, float x, float y, float z, DWORD flag1, DWORD flag2)
{
DWORD index = 0;


for (int i=0; index < 75; i++)
{
  index = i;


if ( VCRadarBlips[index].inUse == 0)
   {
	   VCRadarBlips[index].typeMarker = type;
	   VCRadarBlips[index].id_color = 5;
	   VCRadarBlips[index].field_26 = 1;
	   VCRadarBlips[index].inUse = 1;
	   VCRadarBlips[index].field_28 = 0;
	   VCRadarBlips[index].field_2C = 0x3F800000;
	   VCRadarBlips[index].pos.x = x;
	   VCRadarBlips[index].pos.y = y;
	   VCRadarBlips[index].pos.z = z;
	   VCRadarBlips[index].field_18 = VCRadarBlips[index].pos;
	   VCRadarBlips[index].entityHandle = 0;
	   VCRadarBlips[index].scale = 1;
	   VCRadarBlips[index].field_32 = flag2;
	   VCRadarBlips[index].iconID = 0;

	   if (VCRadarBlips[index].field_24 <= 0xFFFE)
     	   {
             VCRadarBlips[index].field_24 = 1;
			 return ((VCRadarBlips[index].field_24 << 16) | index);
	       }

	   VCRadarBlips[index].field_24 += VCRadarBlips[index].field_24;
	   return ((VCRadarBlips[index].field_24 << 16) | index);
   }


}

 return ((VCRadarBlips[index].field_24 << 16) | index);
};
VintProg вне форума Ответить с цитированием
Старый 12.08.2011, 12:19   #10
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
DWORD __cdecl Create_Marker(DWORD type, float x, float y, float z, DWORD flag1, DWORD flag2)
{
DWORD result = -1;


for (int i=0; i < 75; i++)
{



if ( VCRadarBlips[i].inUse == 0)
   {
	   VCRadarBlips[i].typeMarker = type;
	   VCRadarBlips[i].id_color = 5;
	   VCRadarBlips[i].field_26 = 1;
	   VCRadarBlips[i].inUse = 1;
	   VCRadarBlips[i].field_28 = 0;
	   VCRadarBlips[i].field_2C = 1.0f; 
	   VCRadarBlips[i].pos.x = x;
	   VCRadarBlips[i].pos.y = y;
	   VCRadarBlips[i].pos.z = z;
	   VCRadarBlips[i].field_18 = VCRadarBlips[i].pos;
	   VCRadarBlips[i].entityHandle = 0;
	   VCRadarBlips[i].scale = 1;
	   VCRadarBlips[i].field_32 = flag2;
	   VCRadarBlips[i].iconID = 0;

	   VCRadarBlips[i].field_24++;
	   if ((VCRadarBlips[i].field_24 & 0xFFFF)==0) VCRadarBlips[i].field_24 = 1;

result = ((VCRadarBlips[index].field_24 << 16) | i)
break;
	       }

   }


}

 return result;
};
f.hump вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Команды KostyaS Свободное общение 2 03.04.2011 16:58
Команды cargo29 Работа с сетью в Delphi 2 16.12.2010 13:14
Ловля команды volotsky Помощь студентам 2 05.12.2008 19:52
2 команды Aivar Помощь студентам 2 01.10.2008 19:23
Подскажите что обозначают команды Luska Помощь студентам 4 22.05.2007 21:04