我在一些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是一个非常快速的指令,但我不确定在内存中引用它是否比仅使用变量更有效。
答案 0 :(得分:1)
当您对给定变量进行多次访问且变量是全局变量时(即通过绝对地址寻址),使用某些寄存器(不是必需的eax
)会更好。
在问题的代码中,变量是函数参数,它们由ESP
或EBP
指向(取决于编译器)。因此,它与使用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
...