是否可以强制GCC在不进行内联汇编的情况下输出我给出的确切按位指令?

时间:2019-03-18 22:38:08

标签: c gcc optimization gcc6

我写的代码看起来像这样:

char* xor_and_print(byte arr[], size_t buffSize, byte key)
{
    size_t i;

    for(i = 0; i < buffSize; i++)
    {
        printf("%c", (arr[i] & ~key) | (key & ~arr[i]));
    }
    putchar('\n');
}

这是一个异或运算,分解成更多指令。我正在使用gcc-6.3.0。即使我使用-O0标志进行编译,gcc也会在反汇编中将其转换为一条单独的xor指令。是否可以强迫它用标志编写那些特定的asm指令,或者我必须使用内联汇编语言?

1 个答案:

答案 0 :(得分:2)

使用volatile应该避免这种优化:

for(i = 0; i < buffSize; i++)
{
    byte volatile b = arr[i];
    printf("%c", (b & ~key) | (key & ~b));
}

但是对于更高的优化级别,它也会保持未优化状态。