нужно немного понять, что делает этот встроенный asm (C++), чтобы я мог его правильно преобразовать, чтобы компилировать для x64. inline asm невозможно с Visual Studio и x64. мое исследование говорит мне, что я должен использовать intrinics ИЛИ помещать inline asm в asm-файл и помещать этот asm-файл в мой проект.inline asm to x64 - понимание
как вы можете я действительно не знаю, о чем я говорю, но вы должны получить общую идею.
Я действительно хотел бы понять, как получить этот встроенный asm для работы в компилированном коде x86 или x64. если бы я мог понять, что это делает, возможно, я смогу преобразовать в C++. или переместите этот встроенный asm в asm-файл. Я знаю, как перейти к отдельному файлу. проблема с переходом в asm-файл заключается в том, что я не уверен, как настроить мою функцию asm, чтобы принять параметр, который мне нужно передать. Я бы хотел, чтобы простой ответ, когда кто-то просто делает это для меня, НО то, что мне нужно, является объяснением, поэтому я могу в будущем сделать это самостоятельно. У меня есть два блока встроенного asm, и это, по-видимому, легче из двух.
// FIRST inline asm talked about above
// little endian
void BlockInc(unsigned char *data)
{
#if DATA_BLOCK_SIZE==16
__asm
{
mov edi,[data]
add dword ptr [edi+0],1
adc dword ptr [edi+4],0
adc dword ptr [edi+8],0
adc dword ptr [edi+12],0
}
#else
#error
#endif
}
//this is the second more difficult inline asm not mentioned
void concThread(void *param)
{
unsigned long threadN = *((unsigned long *)param);
while(true)
{
unsigned long index;
// 1. synch
WaitForSingleObject(concThread_semaphores1[threadN],INFINITE);
ReleaseSemaphore(concThread_semaphores2[threadN],1,NULL);
if(sharedStop)
{
_endthread();
}
// start "sharedValue" concurrent modify
while(!sharedOkToGo);
for(index=0;index<(CYCLE_NUM/128);index++)
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
if(threadN%2)
{
__asm
{
movzx ecx,byte ptr [li]
jecxz LOOP0_PREHEAD
jmp LOOP0_HEAD
LOOP0_PREHEAD:
inc ecx
LOOP0_HEAD:
dec sharedValue
loop LOOP0_HEAD
}
}
else
{
__asm
{
movzx ecx,byte ptr [li]
jecxz LOOP1_PREHEAD
jmp LOOP1_HEAD
LOOP1_PREHEAD:
inc ecx
LOOP1_HEAD:
inc sharedValue
loop LOOP1_HEAD
}
}
}
ReleaseSemaphore(concThread_semaphores2[threadN],1,NULL);
}
}
EDITED ASM: комментарий ниже предположил, что это не было правильно написано.
Это одна из причин встроенного ассемблера не рекомендуется для x86, так и не поддерживаются для x64 или ARM. Этот код написан для оптимизации для некоторой древней платформы, когда он, вероятно, будет быстрее, чем C++. –
Можете ли вы предложить способ выполнить эту же задачу, но с помощью C++? –
Я сомневаюсь, что этот сборщик был когда-либо оптимальным для любой платформы, и это совсем не ясно, если вообще что-то полезно. Вам нужно выяснить, что это за предположение, и если он действительно должен быть полезен, полностью переписать его для использования атомных операций по мере необходимости. –