【问题标题】:How to program x64 assembly with c++ in VS 2019?如何在 VS 2019 中使用 c++ 编写 x64 程序集?
【发布时间】:2020-05-25 02:05:34
【问题描述】:

我正在尝试使用 Visual Studio 2019 获得一个非常简单的 x64 程序集,但它一直给我“致命错误 LNK1120: 1 unresolved externals”我确保在构建依赖项中检查了 masm,那就是在 x64 模式下;所以,不知道还能做什么,因为这是我第一次进入 asm。任何帮助将不胜感激!谢谢。

#include <iostream>
using namespace std;
extern "C" int someNumber();
int main() {
cout << "Number: " << someNumber() << endl;
return 0;
}

.code
someNumber proc
    mov rax, 222
    ret
someNumber endp
end

【问题讨论】:

  • 链接器错误的其余部分是什么?即,它正在寻找的符号的错位名称是什么?您可能只需将程序集源中的someNumber 更改为_someNumber
  • 1>----- 构建开始:项目:汇编,配置:调试 x64 ------ 1>assemb.cpp 1>assemb.obj:错误 LNK2019:未解析的外部符号函数 main 1>C:\Users\user\source\repos\assemb\x64\Debug\assemb.exe 中引用的 someNumber:致命错误 LNK1120:1 未解决的外部 1>完成构建项目“assemb.vcxproj” - 失败。 ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
  • 我尝试添加下划线,但仍然不行,并且不确定符号的错位名称是什么意思,但我会尽快查找并发布——我要去片刻。不过感谢您的回复。
  • 链接CPP文件时需要包含汇编器创建的.obj文件。

标签: c++ visual-studio assembly x86-64


【解决方案1】:

您需要为程序集源文件创建自定义构建工具(或步骤)。右键单击程序集源文件名,然后单击属性,...,自定义构建工具...。

对于调试版本:

Command Line   ml64 /c /Zi /Fo$(OutDir)\someNumber.obj someNumber.asm
Outputs        $(OutDir)\someNumber.obj

对于发布版本,相同的行但没有 /Zi

Command Line   ml64 /c /Fo$(OutDir)\someNumber.obj someNumber.asm
Outputs        $(OutDir)\someNumber.obj

在 someNumber.asm 中,需要将函数声明为 public:

        .code
        public someNumber
someNumber proc
        mov     rax, 222
        ret
someNumber endp
        end

VS2019 汇编器 ML64 默认为“C”模型,因此无需在名称前加上“_”。

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2020-05-13
    • 2019-07-20
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多