哪个,在x86中,效率更高?使用变量的变量或lea?

时间:2015-04-27 20:11:05

标签: c++ performance assembly x86

我在一些c ++代码中有一段x86代码:

void encrypt_chars (int lengthW, char EKey)
{
    __asm {                                     //
            xor esi, esi                        //zeroise esi
            mov edi, lengthW                    //store the max loop counter in a register
    for:     
            movzx  ecx, OChars[esi]             //store the character to encrypt

            lea    eax, EKey                    //by ref

            movzx   ebx, byte ptr[eax]          //store the EKey value in EBX as a keep safe for when the original is changed later 
            sub     ecx, 0x0A                   //change the current characters hex value by -10 (denary)
            and     byte ptr[eax], 0xAA         //and EKey with 170(denary) to get an encryption value
            not     byte ptr[eax]               //not the encryption value to obtain a different value
            movzx   edx, byte ptr[eax]          //store the encryption value in EDX
            or      ebx, 0xAA                   //create a second encryption value
            add     bl, dl                      //add the values in the last 8 bits of EBX and EDX (the two encryption values), store them in the last 8 bits of EBX (ignores the 9th bit from carry)
            xor     ecx, ebx                    //encrypt the original letter with the encryption value
            rol     cl, 2                       //futher encryption through rotating last 8 bits of EAX bits 2 to left

            mov    EChars[esi], cl              //move 

            inc    esi                          //increment loop counter
            cmp    esi, edi                     //compare loop counter and the max number of loops
            jl     for                          //jump if esi is less than the loop counter

    }

return;
}

我的问题是,更高效的是,将lea用于eax然后使用指针,或者使用变量本身而不是所有字节ptr [eax]。 我知道lea是一个非常快速的指令,但我不确定在内存中引用它是否比仅使用变量更有效。

2 个答案:

答案 0 :(得分:1)

当您对给定变量进行多次访问且变量是全局变量时(即通过绝对地址寻址),使用某些寄存器(不是必需的eax)会更好。

在问题的代码中,变量是函数参数,它们由ESPEBP指向(取决于编译器)。因此,它与使用EAX相同。

因此,按名称使用变量将从内循环中释放一条指令(lea eax, EKey),代码将更快一些。

请注意,由于编译器生成的隐藏代码,使用内联汇编会使代码的可读性降低,而且更加模糊。最好用汇编语言编写所有内容,然后将编译后的目标文件链接到C程序。

答案 1 :(得分:0)

似乎大部分代码都在执行8位操作,如果密钥是8位,为什么不将它加载到al?中?你也可以摆脱偏移,以便略微提高速度。

    __asm {
            lea esi, Ochars
            mov edi, lengthW
            add edi, esi
            mov al, Ekey
    for:     
            mov cl, [esi]
            mov bl, al
            sub cl, 0x0a
            ...