`cmovz' 的 GAS 汇编程序操作数类型不匹配
GAS Assembler operand type mismatch for `cmovz'
我正在尝试编写一个简单的汇编程序。出于某种原因,条件移动似乎给了我这个错误。如果我用普通的 mov 指令替换它们,它就可以工作。以下代码有什么问题?
.section .data
supported:
.asciz "AVX is supported"
notsupported:
.asciz "AVX is not supported"
.section .text
.global main
main:
movq , %rax
cpuid
andq [=10=]x10000000, %rcx
cmovnz $supported, %rdi
cmovz $notsupported, %rdi
callq puts
movq [=10=], %rax
ret
cpuid.S:15: Error: operand type mismatch for `cmovnz'
cpuid.S:16: Error: operand type mismatch for `cmovz'
如果您查看 Intel 手册中对 CMOVcc
的描述,您会发现源操作数需要是 r/m64
(即 64 位寄存器或内存位置)。 $supported
和 $notsupported
是立即数,因此不符合 r/m64
.
你可以这样做:
movabs $notsupported,%rdi
movabs $supported,%rbx
testq [=10=]x10000000, %rcx # checks the desired bit without clobbering %rcx
cmovnz %rbx,%rdi
我正在尝试编写一个简单的汇编程序。出于某种原因,条件移动似乎给了我这个错误。如果我用普通的 mov 指令替换它们,它就可以工作。以下代码有什么问题?
.section .data
supported:
.asciz "AVX is supported"
notsupported:
.asciz "AVX is not supported"
.section .text
.global main
main:
movq , %rax
cpuid
andq [=10=]x10000000, %rcx
cmovnz $supported, %rdi
cmovz $notsupported, %rdi
callq puts
movq [=10=], %rax
ret
cpuid.S:15: Error: operand type mismatch for `cmovnz'
cpuid.S:16: Error: operand type mismatch for `cmovz'
如果您查看 Intel 手册中对 CMOVcc
的描述,您会发现源操作数需要是 r/m64
(即 64 位寄存器或内存位置)。 $supported
和 $notsupported
是立即数,因此不符合 r/m64
.
你可以这样做:
movabs $notsupported,%rdi
movabs $supported,%rbx
testq [=10=]x10000000, %rcx # checks the desired bit without clobbering %rcx
cmovnz %rbx,%rdi