Ассемблерный код, встроенный в c, выдающий неправильную ошибку типа операнда для 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);
}

3 ответа

Решение

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

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

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

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

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

cmp reg, reg
cmp reg, mem
cmp mem, reg
cmp reg, const

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

Другие вопросы по тегам