ассемблерный код, встроенный в c, который дает неправильную ошибку типа операнда для cmp - PullRequest
1 голос
/ 14 сентября 2011

Я создал программу, которая должна проверять, является ли число положительным, отрицательным или нулевым. Когда я пытаюсь скомпилировать код, он выдает неправильную ошибку типа операнда для строки 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);
}

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Первый операнд инструкции cmp должен быть регистром или ячейкой памяти, а не непосредственным значением. Вам нужно использовать cmp eax, 0 вместо этого. Это также будет соответствовать вашим условным переходам (jl будет переходить, если eax отрицательно и т. Д.).

Возможно, вы путаете синтаксис сборки Intel (который вы использовали) с синтаксисом AT & T, где порядок операндов обратный.

Кроме того, вы используете ret неправильно: ret используется для возврата из функции, но здесь нет вызова функции. Что вам нужно, это jmp до mov output, ebx линии.

1 голос
/ 14 сентября 2011

Синтаксис cmp для сравнения регистра с константой требует, чтобы константа заняла второе место. Так что cmp eax, 0 должно быть в порядке.

Допустимые комбинации:

cmp reg, reg
cmp reg, mem
cmp mem, reg
cmp reg, const
1 голос
/ 14 сентября 2011

Вы не можете иметь непосредственный первый операнд для cmp.Вам нужно сделать cmp eax, 0.

...