Ассемблерный код, встроенный в 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
вместо.