每个函数名后的@n("at符号")是什么?

Ris*_*abh 2 assembly nasm

我正在尝试使用Netwide Assembler学习汇编语言.

在教程中,我看到每个函数名称的末尾都有一个,例如:@n

CALL _GetStdHandle@4

CALL _WriteFile@20

CALL _ExitProcess@4
Run Code Online (Sandbox Code Playgroud)

这是什么意思?@n

(它似乎是函数名称的一部分,因为error LNK2001: unresolved external symbol如果我修改或删除该部分,我会收到错误,但显然它不是它生成的C或C++函数名称的一部分.它来自哪里? )

Mic*_*ael 7

这些是stdcall名字装饰:

名称 - 装饰约定
下划线(_)以名称为前缀.该名称后跟at符号(@),后跟参数列表中的字节数(十进制).因此,声明为的函数int func( int a, double b )装饰如下:_func@12

AC/C++编译器会自动为您处理这个问题(一些汇编程序也是如此),这就是您之前没有看到过的原因.

  • 您应该注意"stdcall"是一种与"cdecl"不同的调用约定."stdcall"函数将使用"ret N"指令从堆栈中删除参数,而"cdecl"函数将使用"ret"指令,该指令不会从堆栈中删除参数.使用错误数量的参数调用"cdecl"函数并不重要; 调用"stdcall"函数是!因此,参数的数量被编码到"stdcall"函数的函数名中以避免这种情况. (3认同)