错误 C2420:第一个操作数中有非法符号
Error C2420 : illegal symbol in first operand
我有这段代码,我正在使用 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
没有它,代码就可以工作。但是我需要这条线,如何解决这个问题?
我修复了它,我需要对其他名称进行较少的更改(例如 less1))
您已通过以下行将整个 std
名称space 包含到本地名称space 中:
using namespace std;
问题在于 std
名称space 包含用于比较的函数对象(class 模板)std::less
, std::greater_equal
等。
由于 std::less
已被拉入本地名称space,您使用的 MSVC 内联汇编代码被混淆,因为它认为您正试图 jmp
到标签 less
来自 std
名称 space 而不是内联汇编代码中的标签 less
。
正确的解决方法是删除这一行:
using namespace std;
包含整个 std
名称space 是不好的做法。删除上面的行将需要更改此行:
cout << values[i] << endl;
至:
std::cout << values[i] << std::endl;
或者您可以将 using namespace std;
替换为:
using std::cout;
using std::endl;
这只会将这两项包含到本地名称中 space。
我有这段代码,我正在使用 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
没有它,代码就可以工作。但是我需要这条线,如何解决这个问题?
我修复了它,我需要对其他名称进行较少的更改(例如 less1))
您已通过以下行将整个 std
名称space 包含到本地名称space 中:
using namespace std;
问题在于 std
名称space 包含用于比较的函数对象(class 模板)std::less
, std::greater_equal
等。
由于 std::less
已被拉入本地名称space,您使用的 MSVC 内联汇编代码被混淆,因为它认为您正试图 jmp
到标签 less
来自 std
名称 space 而不是内联汇编代码中的标签 less
。
正确的解决方法是删除这一行:
using namespace std;
包含整个 std
名称space 是不好的做法。删除上面的行将需要更改此行:
cout << values[i] << endl;
至:
std::cout << values[i] << std::endl;
或者您可以将 using namespace std;
替换为:
using std::cout;
using std::endl;
这只会将这两项包含到本地名称中 space。