[英]inline asm to x64 - understanding
需要一些帮助来了解此内联asm(c ++)的功能,以便我可以正确地对其进行转换,以便可以针对x64进行编译。 Visual Studio和x64不能使用内联asm。 我的研究告诉我,我应该使用intrinics或将嵌入式asm放入一个asm文件中,然后将该asm文件放入我的项目中。
尽我所能,我真的不知道我在这里在说什么,但您应该了解一下总体思路。
我真的很想了解如何使此嵌入式asm在x86或x64编译代码中工作。 如果我能理解它在做什么,那么也许我可以转换为c ++。 或将此嵌入式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);
}
}
汇编的asm:下面的评论表明该词写得不正确。
对于初学者来说,代码是错误的。 鉴于inc
不会修改进位标志,因此下一个adc
将使用它的初始零值,因此它将永远不会进位到第二个双字。
就是说,如果您想自己转换此代码,则当然需要一个指令集引用来查看每个指令的作用。 在这种情况下,显然它希望增加一个128位数字。
这个
movzx ecx,byte ptr [li]
jecxz LOOP0_PREHEAD
jmp LOOP0_HEAD
LOOP0_PREHEAD:
inc ecx
LOOP0_HEAD:
dec sharedValue
loop LOOP0_HEAD
看起来像
// ecx was used to hold a loop count
uint32_t i = li;
// do-while to guarantee execution at least once
// since LOOP0_PREHEAD incremented ecx if it was zero
do {
sharedValue--;
i--;
} while (i > 0);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.