gpt4 book ai didi

c++ - 内联 asm 到 x64 - 理解

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:07 25 4
gpt4 key购买 nike

需要一些帮助来理解这个内联 asm 的作用 (c++),以便我可以正确地转换它,以便我可以为 x64 编译。 Visual Studio 和 x64 无法使用内联汇编。我的研究告诉我,我应该使用内在函数或将内联 asm 放入 asm 文件并将该 asm 文件放入我的项目中。

如你所知,我真的不知道我在这里谈论的是什么,但你应该了解总体思路。

我真的很想了解如何让这个内联汇编在 x86 或 x64 编译代码中工作。如果我能理解这是在做什么,那么也许我可以转换为 C++。或将此内联 asm 移动到 asm 文件。我有点知道如何移动到一个单独的文件。移动到 asm 文件的问题是我不确定如何设置我的 asm 函数来接受我需要传递给它的参数。我想要一个简单的答案,有人只是为我做这件事,但我需要的是一个解释,以便我将来可以自己做这件事。我有两个内联 asm block ,这似乎是两个中更容易的一个。

inline asm to asm file

// 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 位数。

关于c++ - 内联 asm 到 x64 - 理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34818648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com