VS2019 内联汇编开发

本文介绍了如何在Visual Studio 2019(VS2019)中使用内联汇编,包括32位汇编的简单实现和64位汇编的处理方法。由于VS2019原生不支持64位内联汇编,作者推荐使用LLVM Clang作为工具集,详细阐述了设置过程和使用自定义构建工具的方法。内联汇编主要用于优化代码,提高CPU指令管道利用率和寄存器数据利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

 

首先什么是内联汇编?

内联汇编是在C,C++代码内部嵌入一部分汇编代码, 这部分代码会被编译器跳过直接拼接.

为什么要用内联汇编?

这种情况一般是由于我们对于当前的编译器的能力感到不满意, 所以需要代替编译器来优化一些代码片段. 当然我们可以完全进行汇编实现, 直接把函数写成一个.asm汇编文件(这个文件可以用yasm, nasm, masm进行编译为object文件参与代码链接). 内联汇编相比较而言不用实现整个函数, 比如函数的入栈和出栈的操作, 栈指针也不需要你去计算然后移动, 只需要用寄存器实现高效率的计算.

内联汇编需要特殊的编译器或者命令吗?

内联汇编属于正常C++编译器的特性, 不需要额外的编译命令. 但是MSVC目前只支持32位的内联汇编, 64位汇编据官方说法是没必要.  如果使用Clang进行编译的话就没有问题, 都支持.

微软原话:Inline assembly is not supported on the ARM and x64 processors.  具体官方链接在这里:https://docs.microsoft.com/zh-cn/cpp/assembler/inline/inline-assembler?view=msvc-160

 

正文

一. 32位汇编

a. 首先创建一个win32的空项目, 这一步省略, 可以参考我前面的文章.

b. 一个简单的内联汇编代码如下:

#include <stdio.h>

int main()
{
  int test = 1;
  __asm
  {
    mov  eax, test //把test的值写入eax寄存器
    dec  eax  //寄存器数值减一
    mov  test, eax //把eax的值写回test变量中
  }
  printf("test:%d\n", test); //test 为0
  return 1;
}

c. 整体看起来是这样的:

可以看到写32位的内联汇编只需要修改代码, 不需要更改VS的任何配置就可以.

补充一个内联汇编的技巧:

操作数组和_asm行代码:

__asm后面可以直接跟一行汇编代码. 另外汇编代码支持[]的索引操作符.

但是, 这里有个容易犯错的地方:

这个易错点就是[]里面的index是字节offset, 不是元素的index. 从上图中可以看到mov arr[1], 2; 这个代码实际上把2写到了arr的第0个元素arr[0]的第二个字节

### 如何在 Visual Studio 中配置内联汇编语法 在 Microsoft 的 Visual Studio (VS) 环境下,支持通过 `__asm` 关键字来编写内联汇编代码。然而需要注意的是,这种功能仅适用于 x86 和 x64 架构下的项目设置[^5]。对于 ARM 或其他架构,可能需要借助外部工具链(如 Clang/LLVM),或者直接使用独立的汇编文件。 以下是关于如何在 VS 中配置并使用内联汇编的具体说明: #### 1. 启用内联汇编的支持 为了能够在 Visual Studio 中启用内联汇编功能,必须确保项目的属性已正确配置: - 打开目标项目的 **属性页** (`Project Properties`)。 - 导航到路径: `Configuration Properties -> C/C++ -> Code Generation`. - 将选项 **Enable Minimal Rebuild** 设置为 `No (/Gm-)`。 - 如果未找到此选项,请确认当前平台是否为 Win32/x86 或 x64;ARM 平台不支持内联汇编。 #### 2. 使用 `__asm` 编写内联汇编代码 Visual Studio 支持两种方式书写内联汇编代码: - 单行形式:当只需要一条简单的汇编指令时,可以将其直接跟随 `__asm` 关键字之后。 - 多行形式:多条汇编指令需要用 `{}` 包裹起来,形成一个代码块。 下面是一个单行和多行的例子: ```cpp // 单行内联汇编 int a = 5; __asm mov eax, a; // 多行内联汇编 __asm { xor ebx, ebx inc ebx } ``` 注意,在某些复杂场景中,推荐将整个 `__asm` 块放入括号 `( )` 中以提高可读性和兼容性。 #### 3. 调试与测试 完成上述配置后即可运行调试程序验证效果。如果遇到错误提示,可能是由于以下原因造成的: - 当前活动架构不是 x86 或 x64; - 工程缺少必要的权限或依赖项; - 汇编语法存在拼写或其他逻辑问题。 针对这些问题可以通过调整解决方案平台以及仔细检查源码解决。 --- ### 注意事项 尽管 Visual Studio 提供了便捷的方式用于嵌入汇编代码,但在实际开发过程中仍需谨慎考虑其适用范围。例如现代处理器优化技术已经非常成熟,通常无需手动介入底层操作就能获得良好的性能表现[^3]。因此除非确实必要,否则应优先采用高级别的编程手段解决问题。 此外值得注意的是,随着软件工程实践的发展趋势变化,越来越多开发者倾向于利用跨平台工具链比如 GCC 或 LLVM 来处理复杂的混合语言需求[^2]。这不仅有助于增强移植能力还简化维护成本。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值