【问题标题】:What is the @n ("at sign") after every function name?每个函数名后面的@n(“at 符号”)是什么?
【发布时间】:2015-01-20 07:19:01
【问题描述】:

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

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

CALL _GetStdHandle@4

CALL _WriteFile@20

CALL _ExitProcess@4

@<em>n</em> 是什么意思?

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

【问题讨论】:

标签: assembly nasm


【解决方案1】:

那些是stdcall name decorations:

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

C/C++ 编译器会自动为您处理这个问题(一些汇编程序也是如此),这就是为什么您以前从未见过它。

【讨论】:

  • As 4(int) + 8(double)=12??好的,谢谢你的回答,它对我有帮助!
  • 对。它只是所有参数大小的总和。
  • 您应该注意“stdcall”与“cdecl”的调用约定不同。 “stdcall”函数将使用“ret N”指令从堆栈中删除参数,而“cdecl”函数将使用不会从堆栈中删除参数的“ret”指令。使用错误数量的参数调用“cdecl”函数并不重要;调用“stdcall”函数是!因此,参数的数量被编码到“stdcall”函数的函数名中以避免这种情况。
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2011-02-25
相关资源
最近更新 更多