我正在尝试编写一个简单的汇编程序。出于某种原因,条件移动似乎给了我这个错误。如果我用普通的 mov 指令替换它们,它就可以工作。以下代码有什么问题?

    .section .data

supported:
    .asciz "AVX is supported"
notsupported:
    .asciz "AVX is not supported"


    .section .text
    .global main
main:
    movq $1, %rax
    cpuid
    andq $0x10000000, %rcx
    cmovnz $supported, %rdi
    cmovz $notsupported, %rdi
    callq puts

    movq $0, %rax
    ret
cpuid.S:15: Error: operand type mismatch for `cmovnz'
cpuid.S:16: Error: operand type mismatch for `cmovz'

最佳答案

如果您查看英特尔手册中对 CMOVcc 的描述,您会发现源操作数必须是 r/m64(即 64 位寄存器或内存位置)。 $supported$notsupported 是立即数,因此不符合 r/m64 的条件。

你可以这样做:

movabs $notsupported,%rdi
movabs $supported,%rbx
testq $0x10000000, %rcx   # checks the desired bit without clobbering %rcx
cmovnz %rbx,%rdi

关于assembly - `cmovz' 的 GAS 汇编器操作数类型不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31585739/

10-11 16:32