我有这段代码,我使用的是Visual Studio 2019。编译器给出错误:错误C2420"less":第一个操作数中存在非法符号
#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
没有它,代码就能工作。但我需要这条线,怎么修?
您已经通过以下行将整个std
命名空间包含到本地命名空间中:
using namespace std;
这样做的问题是std
命名空间包括用于比较的函数对象(类模板(std::less
、std::greater_equal
等。
由于std::less
已被拉入本地命名空间,您使用的MSVC内联程序集代码会感到困惑,因为它认为您正在尝试从std
命名空间将jmp
less
标签,而不是内联程序集码中的less
标签。
正确的修复方法是删除此行:
using namespace std;
包含整个std
名称空间是不好的做法。删除上面的行需要更改此行:
cout << values[i] << endl;
至:
std::cout << values[i] << std::endl;
或者,您可以将using namespace std;
替换为:
using std::cout;
using std::endl;
这将只将这两个项目包括在本地名称空间中。
我修复了它,我需要减少对其他名称的更改(例如less1(