我正在尝试弄清楚如何正确使用'A'
指令。据我所知,CMOV
的使用与条件跳转指令完全相同。它根据之前的CMOV
或test
指令的标志跳转/移动:
cmp
因此,我尝试使用它来创建一个小的函数,该函数根据测试变量是否为0返回test %ecx, %ecx
cmovz %ebx, %eax
或old_val
:
new_val
但是当我编译它时,它总是返回old_val。我的错误在哪里?
很明显,这可以在C / C ++中用一个简单的if来完成,但是我想用uint32_t cmov(uint8_t pred, uint32_t old_val, uint32_t new_val)
{
uint32_t result = 0;
__asm__ __volatile__(
"mov %2, %0;"
"test %1, %1;"
"cmovz %3, %0;"
: "=r"(result)
: "r"(pred), "r"(old_val), "r"(new_val)
: "cc");
return result;
}
来完成。
完整示例:
CMOV