![](/img/trans.png)
[英]C embedded assembly error: ‘asm’ operand has impossible constraints
[英]assembly code embedded in c giving a improper operand type error for cmp
我制作了一个程序,该程序应检查数字是正数,负数还是零。 当我尝试编译代码时,对于第28行(即cmp操作码),它给出了不正确的操作数类型错误。 我格式化错误,还是这里还有其他问题?
#include <stdio.h>
int input;
int output;
int main (void)
{
scanf("%d", &input);
__asm
{
jmp start
negative:
mov ebx, -1
ret
nuetral:
mov ebx, 0
ret
positive:
mov ebx, 1
ret
start:
mov eax, input
mov ebx, other
cmp 0, eax
jl negative
je neutral
jg positive
mov output, ebx
}
printf("%d\n", output);
}
cmp
指令的第一个操作数必须是寄存器或存储器位置,而不是立即数。 您需要使用cmp eax, 0
而不是cmp eax, 0
。 这也将与您的条件跳转一致(如果eax
为负,则jl
会跳转,等等)。
您可能会使Intel汇编语法(您使用过的)与AT&T语法混淆,在AT&T语法中,操作数的顺序相反。
另外,您对ret
的使用是不正确的: ret
用于从函数返回,但是这里没有函数调用。 您需要的是mov output, ebx
行的jmp
。
您不能将立即数作为cmp
的第一个操作数。 您需要执行cmp eax, 0
而不是cmp eax, 0
。
用于将寄存器与常量进行比较的cmp语法要求常量排在第二位。 所以cmp eax, 0
应该没问题。
有效组合为:
cmp reg, reg
cmp reg, mem
cmp mem, reg
cmp reg, const
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.