gcc 在巨集中的內聯彙編

我們可以將彙編指令放在巨集中,並像使用函式一樣使用巨集。

#define mov(x,y) \
{ \
    __asm__ ("l.cmov %0,%1,%2" : "=r" (x) : "r" (y), "r" (0x0000000F)); \
}

/// some definition and assignment
unsigned char sbox[size][size];
unsigned char sbox[size][size];

///Using
mov(state[0][1], sbox[si][sj]);

使用嵌入在 C 程式碼中的內聯彙編指令可以改善程式的執行時間。這在時間緊迫的情況下非常有用,例如 AES 等加密演算法。例如,對於 AES 演算法中需要的簡單移位操作,我們可以用 C 移位運算子 >> 替換直接 Rotate Right 彙編指令。

在’AES256’的實現中,在’AddRoundKey()‘函式中我們有一些這樣的語句:

unsigned int w;          // 32-bit
unsigned char subkey[4]; // 8-bit, 4*8 = 32 

subkey[0] = w >> 24;     // hold 8 bit, MSB, leftmost group of 8-bits 
subkey[1] = w >> 16;     // hold 8 bit, second group of 8-bit from left    
subkey[2] = w >> 8;      // hold 8 bit, second group of 8-bit from right
subkey[3] = w;           // hold 8 bit, LSB, rightmost group of 8-bits

/// subkey <- w

他們只是將 w 的位值分配給 subkey 陣列。

我們可以改變三個 shift + assign 和一個只用一個程式集 Rotate Right 操作分配 C 表示式。

__asm__ ("l.ror  %0,%1,%2" : "=r" (* (unsigned int *) subkey)  : "r" (w), "r" (0x10));

最終結果完全相同。