Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 每个函数名后面的@n(";at符号";)是什么?_Assembly_Nasm - Fatal编程技术网

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

Assembly 每个函数名后面的@n(";at符号";)是什么?,assembly,nasm,Assembly,Nasm,我正在尝试学习汇编语言,使用Netwide汇编程序 在教程中,我看到每个函数名的末尾都有一个@n,如: CALL _GetStdHandle@4 CALL _WriteFile@20 CALL _ExitProcess@4 这是什么意思 (它似乎是函数名称的一部分,因为我得到了错误LNK2001:未修改的外部符号< /代码>错误,如果我修改或删除该部分,但显然它不是C或C++函数的名称的一部分,它是从哪里产生的?”< /P> < P> 名称装饰约定 名称的前缀是下划线(。)。在参数列表中,

我正在尝试学习汇编语言,使用Netwide汇编程序

在教程中,我看到每个函数名的末尾都有一个
@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”函数的函数名中,以避免出现这种情况。