You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.ASM文件中调用命名空间函数?是否可行及语法是什么?

问题解答

1. 能否从汇编文件调用命名空间内的C++函数?

可以调用,但要注意C++的**名字修饰(Name Mangling)**机制:命名空间内的函数会被编译器修改名称,汇编代码里必须使用修饰后的名字才能正确链接。

2. 正确的调用语法

方法1:使用编译器生成的修饰名

不同编译器的名字修饰规则不同,以MSVC为例,MyNameSpace::PrintString()的修饰名通常是?PrintString@MyNameSpace@@YAXXZ(可通过查看编译生成的.obj文件符号表获取准确修饰名)。

修改汇编代码如下:

EXTERN ?PrintString@MyNameSpace@@YAXXZ:PROC

.data    
    dbgString byte "Just a string!", 0

.code
main PROC
    CALL ?PrintString@MyNameSpace@@YAXXZ
main ENDP

方法2:用extern "C"消除名字修饰

如果不想依赖编译器特定的修饰名,可在C++头文件中用extern "C"声明函数,让编译器按照C语言规则生成未修饰的名字:

修改Test.h:

namespace MyNameSpace
{
    extern "C" void PrintString()
    {
         // 函数实现
    }
}

此时汇编代码可直接使用原函数名:

EXTERN PrintString:PROC

.data    
    dbgString byte "Just a string!", 0

.code
main PROC
    CALL PrintString
main ENDP

错误原因说明

你遇到的LNK2019错误,是因为汇编里声明的PrintString找不到对应符号——C++编译器将MyNameSpace::PrintString编译成了带命名空间修饰的名字,而汇编里使用的是未修饰的原名字,链接器无法匹配两者。

内容的提问来源于stack exchange,提问作者JkT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:15:33