针对AMD6 / x86_64的GCC内联汇编

时间:2014-01-14 14:16:23

标签: gcc x86 sse2

所以我正在尝试编写一些将变量加载到SSE2寄存器中的内联汇编。 然而,内联汇编并不是那么顺利。

我在GCC编译时遇到了绕道。

g++-4.8.2 -g -maes -msse4 aesni.c -o aesni
aesni.c:101:junk `ptr[%rax]' after expression
aesni.c:101:32-bit absolute addressing is not supported for x86-64
aesni.c:101:cannot do signed 4 byte relocation
aesni.c:102:junk `ptr[%rdx]' after expression
aesni.c:102:32-bit absolute addressing is not supported for x86-64
aesni.c:102:cannot do signed 4 byte relocation

代码:

#include <string.h> // string
using namespace std;

int main (int argc, const char *argv[])
{

    // Nr = 10 (128bit), 12 (192bit), 14 (256bit)

    __attribute__((aligned (16))) unsigned char Key128bit[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,  0x00 };

    __attribute__((aligned (16))) unsigned char Key192bit[] = { 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
                                                                0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b,  0x00 };

    __attribute__((aligned (16))) unsigned char Key256bit[] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
                                                                0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4,  0x00 };


    char Nr = 10; // 128bit / 12 for 192bit / 14 for 256bit


    /* zero out XMM registers */
    asm volatile ("PXOR %xmm0, %xmm0\n"
                  "PXOR %xmm1, %xmm1\n"
                  "PXOR %xmm2, %xmm2\n"
                  "PXOR %xmm3, %xmm3\n"
                  "PXOR %xmm4, %xmm4\n"
                  "PXOR %xmm5, %xmm5\n"
                  "PXOR %xmm6, %xmm6\n"
                  "PXOR %xmm7, %xmm7\n"
                  "PXOR %xmm8, %xmm8\n"
                  "PXOR %xmm9, %xmm9\n"
                  "PXOR %xmm10, %xmm10\n"
                  "PXOR %xmm11, %xmm11\n"
                  "PXOR %xmm12, %xmm12\n"
                  "PXOR %xmm13, %xmm13\n"
                  "PXOR %xmm14, %xmm14\n"
                  "PXOR %xmm15, %xmm15\n");


    __attribute__((aligned (16))) unsigned char *KeyRound0, *KeyRound1;
    __attribute__((aligned (16))) unsigned char KeyRound1Temp[16];


    switch(Nr+1)
    {
        case 11:
        KeyRound0 = Key128bit;
        break;
        case 13:
        KeyRound0 = Key192bit;

        memset( KeyRound1Temp, 0x00, 16);
        memcpy( KeyRound1Temp, Key192bit+16, 8);
        KeyRound1 = KeyRound1Temp;
        break;
        case 15:
        KeyRound0 = Key256bit;

        memcpy( KeyRound1Temp, Key256bit+16, 16);
        KeyRound1 = KeyRound1Temp;
        break;
    }


    asm volatile("MOVDQA qword ptr [%0], %%xmm0\n"
                 "MOVDQA qword ptr [%1], %%xmm0\n"
                : /* output operands */
                : /* input operands */ "r" (KeyRound0), "r" (KeyRound1)
                : /* list of clobbered registers */
                );

}

0 个答案:

没有答案