【发布时间】:2016-01-15 19:42:50
【问题描述】:
需要一些帮助来理解这个内联 asm 的作用 (c++),以便我可以正确转换它,以便我可以为 x64 编译。 Visual Studio 和 x64 无法使用内联汇编。我的研究告诉我,我应该使用 intrinics 或将内联 asm 放入 asm 文件并将该 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++ 吗?
-
我怀疑这个组件的第二个块对于任何平台来说都是最佳的,而且它根本不清楚是否有任何有用的东西。您需要弄清楚它应该做什么以及它是否真的有用,完全重写它以根据需要使用原子操作。
标签: c++ c visual-c++ assembly visual-studio-2015