Ошибка C2420: недопустимый символ в первом операнде - PullRequest
1 голос
/ 20 апреля 2020

У меня есть этот код, я использую Visual Studio 2019. Компилятор выдает ошибку: Ошибка C2420 «меньше»: недопустимый символ в первом операнде

#include <iostream>
using namespace std;
int a, b, c, d, x;
int values[5]; // масив для збереження у(х)
void main() {
a = -6; b = 4; c = 8; d = 2;
__asm {
    mov eax, offset values
    push eax 
    mov cx, 5 
    start: 
        mov ax, 3 
        sub ax, cx 
        cwde 
        mov ebx, eax 
        mov eax, a 
        cmp ebx, 1 
        jl less // if х < 1, go to less
        je equals //if х == 1, go to equals

        // if х > 1:

        imul eax // a^2
        sub eax, ebx // a^2-x
        cdq 
        mov ebx, c 
        idiv ebx // (a^2-x)/c
        jmp result 

    less :
        mov edx, 2
        imul edx // a*2
        imul ebx // a*2*x
        add eax, 5 // a*2*x+5
        jmp result 
    equals :
        mov ebx, b 
        sub eax, ebx // a-b
        cdq 
        mov ebx, d 
        idiv ebx // (a-b)/d
        jmp result 
    result :
        pop ebx 
        mov[ebx], eax 
        add ebx, 4 
        push ebx 
        loop start 
}
for (int i = 0; i < 5; i++) {
    cout << values[i] << endl;
}
system("pause");
}

Компилятор выдает ошибку из-за этой строки:

jl less

Без него код работает. Но мне нужна эта строка, как это исправить?

Ответы [ 2 ]

4 голосов
/ 20 апреля 2020

Вы включили все пространство имен std в локальное пространство имен строкой:

using namespace std;

Проблема в том, что std пространство имен включает объекты функций (шаблоны классов) std::less, std::greater_equal и др. c, которые используются для сравнений.

Поскольку std::less было перенесено в локальное пространство имен, MSV C inline Используемый вами код сборки сбит с толку, поскольку он думает, что вы пытаетесь jmp перейти к метке less из пространства имен std, а не к метке less далее в встроенном коде сборки.

удалить эту строку:

using namespace std;

Неправильно включать все пространство имен std. Удаление строки выше потребует изменения этой строки:

cout << values[i] << endl;

на:

std::cout << values[i] << std::endl;

В качестве альтернативы вы можете заменить using namespace std; на:

using std::cout;
using std::endl;

Это будет включайте только эти два элемента в локальное пространство имен.

0 голосов
/ 20 апреля 2020

Я исправил это, мне нужно было поменять меньше на какое-то другое имя (например, less1))

...