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));
最终结果完全相同。