【问题标题】:Univeral Windows Platform C++ with x64 assembly language使用 x64 汇编语言的通用 Windows 平台 C++
【发布时间】:2018-06-07 01:51:41
【问题描述】:

我正在考虑在 Windows 10 上使用 C++ 和汇编语言。我从桌面上的 x64 asm 开始,然后我想在 Win 10 IOT Core 上尝试 ARM asm。

该项目通常包含大量 C++ 代码和一些汇编语言代码,但我会看到它的去向。为什么要使用汇编?纯粹是为了好玩。整个项目是一种重新回到 C++ 和汇编的爱好。

UWP C++ 似乎是要走的路,即最新的 Microsoft 编程技术。仍然支持 Windows 桌面 C++(即 Win32 或控制台),但我宁愿坚持使用 UWP。

我快速阅读了 UWP C++,没有学习 XAML 的基础知识,而 C++ 又回到了我的身边(我已经好几年没接触过它了)。

使用 Visual Studio Professional(引擎盖下带有 masm)和 x64 asm。

我有一个简单的 Hello World 应用程序。一个文本框和一个按钮。该项目包括一个 .asm 文件,其中包含一个简单的函数,该函数将两个数字相加并以 rax 形式返回结果。这个(asm)函数在按钮点击事件中被调用并输出到文本框文本。

MainPage.xaml.cpp

 extern "C" int SomeFunction();

 void LearningUWPwithCPP::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
 {
    greetingOutput->Text = SomeFunction().ToString();
 }

MainPage.xaml

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel x:Name="contentPanel" Margin="120,30,0,0">
        <TextBlock HorizontalAlignment="Left" Text="Hello World" FontSize="36"/>
        <TextBlock Text="Click the button"/>
        <Button x:Name="inputButton" Content="Click me" Click="Button_Click"/>
        <TextBlock x:Name="greetingOutput"/>
    </StackPanel>
</Grid>

TestASM.asm

    .CODE
    SomeFunction PROC
            mov     rax, 5
            add     rax, 6
            ret
    SomeFunction ENDP
            END

更多信息...

  • Project Build Dependencies 已选中 masm 选项(即打开)。
  • UWP C++ 编译为本机代码,因此它应该接受 asm 文件
  • 不幸的是,关于 UWP 和 asm 的信息似乎不存在(这并不奇怪)

问题:我收到“未解决的外部”错误

有用的提示

  • Intellisense 提示找不到我的 (asm) 函数的 extern 声明中的函数定义。
  • 我可以在 asm 文件中输入任何垃圾,项目将成功编译。

有了这些点,很明显该项目没有找到我的 asm 文件。我不确定如何包含 asm 文件。而且我怀疑 extern 是 Win32 C++ 时代的残余,也许不能在 UWP 中使用。

非常感谢任何帮助。

【问题讨论】:

  • 尝试在解决方案资源管理器中查看您的 asm 文件的属性。具体来说,您正在查看 Excluded from Build 是否设置为 yesItem Type 是否设置为 Microsoft Macro Assembler 以外的其他值。
  • @DavidWohlferd 就是这样!!!问题是这两个属性都设置为空白。适当地设置这些(如您所建议的)修复它。太感谢了!我花了半天时间寻找并尝试了一堆东西。请发表您的评论作为答案,我会将其标记为正确。
  • 您通常不必使用_SomeFunction 作为函数的asm 名称来链接Windows 上的编译器生成的代码吗?还是 MS 的汇编程序会为您进行名称修改?或者 UWP 是否包含一个新的 ABI,其中 C 和 C++ 符号名称在目标文件中根本不以 _ 为前缀?
  • UWP 并不是真正的“最新的微软技术”,它只是 C++ 桌面的一个残缺版本。使用 UWP 的原因是您可以在 Windows 10 商店中销售您的应用程序。
  • @RossRidge 根据我的阅读,UWP 是最新的版本。微软在几年内创建了 Metro Apps (Win8)、WinRT (Win 8.1) 和 UWP (Win10)。 UWP 包括 Win32 和 WinRT API(和其他 API)。此外,我最近了解到 UWP 中的“通用”意味着开发人员可以跨不同硬件(PC、手机、Xbox、物联网......)访问相同的 API,但该应用程序不一定可以在任何地方运行。根据硬件,API 的子集也可用——我要阅读更多内容。 C++ 桌面的残缺版本?你的意思是进行中的工作吗?可能。令人困惑?当然是!

标签: c++ assembly uwp


【解决方案1】:

根据您执行操作的顺序,VS 解决方案资源管理器中的 asm 文件的某些属性可能设置不正确。

常见的解决方案包括从解决方案资源管理器中删除/重新添加 asm 文件,或手动将 Excluded from Build 设置为 no 并将 Item Type 设置为 Microsoft Macro Assembler每个构建配置。

【讨论】:

  • 是的,在将 .asm 文件添加到项目之前设置项目构建依赖项(masm 选项)。
猜你喜欢
  • 2012-05-23
  • 2010-12-21
  • 1970-01-01
  • 2010-10-20
  • 2020-04-13
  • 2011-05-11
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多