1

我编写了一个程序来检查一个数字是正数、负数还是零。当我尝试编译代码时,它给出了一个不正确的操作数类型错误,第 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);
}
4

3 回答 3

3

指令的第一个操作数cmp必须是寄存器或内存位置,而不是立即数。你需要cmp eax, 0改用。这也将与您的条件跳转一致(jl如果eax为负数则会跳转等)。

您可能会将 Intel 汇编语法(您使用的)与 AT&T 语法混淆,其中操作数的顺序是相反的。

此外,您的用法ret不正确:ret用于从函数返回,但这里没有函数调用。你需要的就是一条jmp线mov output, ebx

于 2011-09-14T15:05:54.070 回答
1

您不能将立即数作为 的第一个操作数cmp。你需要这样做cmp eax, 0

于 2011-09-14T15:06:30.060 回答
1

cmp 用于将寄存器与常量进行比较的语法要求常量排在第二位。所以cmp eax, 0应该没问题。

有效的组合是:

cmp reg, reg
cmp reg, mem
cmp mem, reg
cmp reg, const
于 2011-09-14T15:07:18.373 回答