繁体   English   中英

内联asm到x64-了解

[英]inline asm to x64 - understanding

需要一些帮助来了解此内联asm(c ++)的功能,以便我可以正确地对其进行转换,以便可以针对x64进行编译。 Visual Studio和x64不能使用内联asm。 我的研究告诉我,我应该使用intrinics或将嵌入式asm放入一个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);
    }
}

汇编的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM