Assembly 每个函数名后面的@n(";at符号";)是什么?
我正在尝试学习汇编语言,使用Netwide汇编程序 在教程中,我看到每个函数名的末尾都有一个Assembly 每个函数名后面的@n(";at符号";)是什么?,assembly,nasm,Assembly,Nasm,我正在尝试学习汇编语言,使用Netwide汇编程序 在教程中,我看到每个函数名的末尾都有一个@n,如: CALL _GetStdHandle@4 CALL _WriteFile@20 CALL _ExitProcess@4 这是什么意思 (它似乎是函数名称的一部分,因为我得到了错误LNK2001:未修改的外部符号< /代码>错误,如果我修改或删除该部分,但显然它不是C或C++函数的名称的一部分,它是从哪里产生的?”< /P> < P> 名称装饰约定 名称的前缀是下划线(。)。在参数列表中,
@n
,如:
CALL _GetStdHandle@4
CALL _WriteFile@20
CALL _ExitProcess@4
这是什么意思
(它似乎是函数名称的一部分,因为我得到了<代码>错误LNK2001:未修改的外部符号< /代码>错误,如果我修改或删除该部分,但显然它不是C或C++函数的名称的一部分,它是从哪里产生的?”< /P> < P>
名称装饰约定
名称的前缀是下划线(
。
)。在参数列表中,名称后跟at符号(@
),后跟字节数(十进制)。因此,声明为intfunc(inta,double b)
的函数被修饰如下:_func@12
C/C++编译器会自动为您处理此问题(某些汇编器也会自动处理),这就是为什么您以前从未见过此问题。看起来像Meth这个问题似乎同时解决了您的命名约定和链接器问题:As 4(int)+8(double)=12??好的,谢谢你的回答,这对我很有帮助!!正确的。它只是所有参数大小的总和。您应该注意,“stdcall”与“cdecl”是不同的调用约定。“stdcall”函数将使用“ret N”指令从堆栈中删除参数,“cdecl”函数将使用“ret”指令,该指令不会从堆栈中删除参数。使用错误数量的参数调用“cdecl”函数并不重要;调用“stdcall”函数是错误的!因此,参数的数量被编码到“stdcall”函数的函数名中,以避免出现这种情况。