内联汇编中的CMOV无法按预期工作

时间:2018-06-28 08:25:08

标签: c++ assembly x86 inline-assembly

我正在尝试弄清楚如何正确使用'A'指令。据我所知,CMOV的使用与条件跳转指令完全相同。它根据之前的CMOVtest指令的标志跳转/移动:

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

0 个答案:

没有答案