VS2019 内联汇编开发

前言

 

首先什么是内联汇编?

内联汇编是在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]的第二个字节上了, 也就是增加上了512, 加上它自己的2,所以元素0是514.

正确的写法是:

最低0.47元/天 解锁文章
Visual_C++中使用内联汇编
11-01
Visual_C++中使用内联汇编 本文档主要详细介绍如何在c/c++代码内涵汇编代码,推荐给学习c/c++的同学们下载
x86平台转x64平台关于内联汇编不再支持的解决
06-20
x86平台转x64平台关于内联汇编不再支持的解决办法.
【汇编】_Visual Studio2019写32位汇编
最新发布
m0_63299495的博客
04-08 765
此处以hello world 程序为例:.586.data',13,10,0.codemain PROC;push 0h;popadmain ENDPend main粘贴至刚创建的源文件中即可;
x64内联汇编——VS2019
Zhang_Y_Q的博客
03-03 664
修改.asm文件属性。 命令行:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm 输出:$(IntDir)%(fileName).obj
VS2019 X64使用 内联汇编asm
weixin_45252366的博客
03-08 2593
设置 “命令行”为 ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm。举例 :ULONG64 myAdd(ULONG64 u1,ULONG64 u2);右键asm 文件-属性-项目类-Microsoft Macro Assembler。设置 输出为 $(IntDir)%(fileName).obj,1.在源文件中添加 test.asm 后缀的asm文件。右键项目-生成依赖项-生成自定义-勾选masm项。2.右键test.asm 文件打开属性。
VS2019 X64 内联汇编
03-03 511
VS2019下使用X64汇编代码
VS2019中编写X64汇编
老薛的专栏
10-03 920
手把手教你vs中编写汇编代码,本例子中选择的是X64汇编
VS搭建32位和64位汇编开发环境
百里杨的博客
10-26 2734
在菜单中,“调试”->“窗口”->“内存”/“反汇编”/“寄存器”菜单项,可以在调试时,打开对应的窗口。
How to debug LLVM by VS2019 on Windows
TSWorld
02-05 570
怎么在VS2019调试LLVM源码
VS2019环境下的X64汇编
sanqiuai的博客
09-08 2263
1.定义x64汇编函数 在 Source Files 下创建一个*.asm文件,编写以下demo代码: .CODE ;文件开始 vt_Add PROC ;函数开始 add rcx,rdx ;参数1与参数2相加 mov rax,rcx ;结果赋值到rax ret ;返回rax vt_Add ENDP ;函数结束 END ;文件结束 2.调用x64汇编函数 EXTERN_C ULONG64 vt_Add(ULONG64 u1, ULONG64 u2);//声
VS2015默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)
热门推荐
jfsufeng的专栏
01-10 1万+
截至目前(2018年底2019年初),本人windows平台下的各种开发所用的IDE主要就是VS2015。虽然VS2017已经出来一年多了,本人也自己使用过一段时间,但没发现特别大的亮点,又考虑到整个研发团队都在用VS2015,所以也一直是vs2015到现在。 最近在做一个大型矩阵运算相关的研究时,想试着自己结合汇编做点优化实验,当然考虑到实际程序情况,最适合的使用汇编的方式就是内联汇编。Win...
详解VS2010如何搭配汇编程序开发环境的图解教程
04-02
VS2010搭配汇编程序开发环境的图解教程
GCC内联汇编入门[参照].pdf
10-11
"GCC内联汇编入门" GCC内联汇编是一种强大的编程技术,可以帮助开发者在C语言中嵌入汇编代码,从而提高程序的执行效率和性能。GCC内联汇编可以分为基本内联汇编和扩展内联汇编两种形式,前者只允许使用汇编语法,后...
C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)[收集].pdf
10-11
C++ Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数) 本文研究了C++ Hook(钩子)编程中,使类成员函数代替全局函数(静态函数)的技术。通过内联汇编,构造类对象独享的函数(委托),完成了类成员...
cpp-ARMGCC内联汇编参考手册中文版
08-16
ARM GCC 内联汇编参考手册 - 中文版
ARM 汇编指令开发手册 + 内联函数指令(ARMV7 ARMV8)
11-08
ARM 底层指令集,用于嵌入式开发,用于提升性能的开发手册和文档,通常C语言开发使用内联函数指令
GCC内联汇编基础[借鉴].pdf
10-11
GCC内联汇编基础[借鉴].pdf
Visual C++中使用内联汇编
doskey的专栏
10-09 2651
                   在Visual C++中使用内联汇编                           作者:Yonsm一、内联汇编的优缺点    因为在Visual C++中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual C++中不能处理的一些事情,而且可以使用在C/C++中的变量,所以非常方便。内联汇编主要用于如下场合:    1.使用汇编语言写函数
内嵌汇编简介(在C++中嵌入汇编语句)
gxj1680的专栏
05-21 1万+
为了加速游戏,一提起汇编语言,大家也许会感到很神秘。其实如果你学起来就会发现,它并非想象中那样难。特别是内嵌汇编,由于它和C++紧密结合,使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来比较容易。使用内嵌汇编,特别是使用MMX指令,可以大大提高各种游戏中常见特效的速度,对于编出一个漂亮的游戏非常重要。学好汇编语言还有一个特别有趣的用处:可以观察和看懂VC++生成的汇编代码,从而更好地
gcc内联汇编asm格式详解
04-02
GCC内联汇编asm格式是一种将汇编代码嵌入到C或C++源代码中的方法。它允许开发人员直接使用汇编语言来访问底层硬件或执行高性能算法。以下是GCC内联汇编asm格式的详细说明。 基本格式 GCC内联汇编asm格式基本格式如下: ```c asm (assembly code : output operands : input operands : clobbered registers); ``` - assembly code:汇编代码,可以是单行或多行代码。 - output operands:用于存储计算结果的变量,可以有多个,用逗号分隔。输出操作数是可选的,可以省略。 - input operands:用于传递参数的变量,可以有多个,用逗号分隔。输入操作数是必需的。 - clobbered registers:代码执行期间会被修改的寄存器,用于通知编译器。可以有多个,用逗号分隔。clobbered registers是可选的,可以省略。 示例 以下是一个简单的GCC内联汇编asm格式示例,将eax寄存器中的值加1,并将结果存储在eax中。 ```c int value = 10; asm ("addl $1, %%eax" : "=a" (value) : "a" (value)); ``` - "addl $1, %%eax":汇编代码,将eax加1。 - "=a" (value):输出操作数,将eax中的值存储在value变量中。 - "a" (value):输入操作数,将value的值传递给eax。 - 没有clobbered registers。 输出操作数 输出操作数用于将汇编代码的结果存储在变量中。输出操作数有两种类型:普通输出(通道约束)和跨约束输出。 普通输出 普通输出使用“=约束”语法表示,其中约束指定了输出操作数应存储在哪个寄存器或内存位置中。约束可以是以下之一: - "=r"(任意寄存器) - "=m"(任意内存位置) - "=a"(eax寄存器) - "=d"(edx寄存器) - "=q"(eax或edx寄存器) 示例 以下是一个使用普通输出的示例,将eax寄存器中的值加1,并将结果存储在value变量中。 ```c int value; asm ("addl $1, %%eax" : "=a" (value) : "a" (value)); ``` 跨约束输出 跨约束输出是一种将结果存储在多个输出变量中的方法。它使用“+约束”语法表示,其中约束指定了输出操作数应存储在哪个寄存器或内存位置中。多个约束可以用逗号分隔。 示例 以下是一个使用跨约束输出的示例,将eax寄存器中的值加1,并将结果存储在value1和value2变量中。 ```c int value1, value2; asm ("addl $1, %%eax" : "+a" (value1), "=r" (value2)); ``` 输入操作数 输入操作数用于将变量的值传递给汇编代码。输入操作数使用“约束”语法表示,其中约束指定了变量应该存储在哪个寄存器或内存位置中。约束可以是以下之一: - "r"(任意寄存器) - "m"(任意内存位置) - "a"(eax寄存器) - "d"(edx寄存器) - "q"(eax或edx寄存器) 示例 以下是一个使用输入操作数的示例,将value变量的值传递给eax寄存器中。 ```c int value = 10; asm ("movl %0, %%eax" : : "r" (value)); ``` clobbered registers clobbered registers是在汇编代码执行期间会被修改的寄存器列表。它用于通知编译器哪些寄存器应该被保存和恢复。clobbered registers使用“%约束”语法表示,其中约束指定了被修改的寄存器名称。多个寄存器可以用逗号分隔。 示例 以下是一个使用clobbered registers的示例,将eax寄存器中的值加1,并告诉编译器edx寄存器也被修改了。 ```c asm ("addl $1, %%eax" : : "a" (value) : "%edx"); ``` 总结 GCC内联汇编asm格式是一种将汇编代码嵌入到C或C++源代码中的方法。它允许开发人员直接使用汇编语言来访问底层硬件或执行高性能算法。通过输出操作数、输入操作数和clobbered registers,开发人员可以管理汇编代码与C或C++代码之间的数据流和寄存器使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • VS2019 C++的跨平台开发——Android .so开发 31330
  • VS2017的C++开发心得(四)VS的文件夹路径以及项目生成步骤 30818
  • STM32 之 HAL 库串口 USART 丢数据及ORE卡死的解决方案 26643
  • VS2019 C++的跨平台开发——Cmake项目(一) 23359
  • VS2017的C++开发心得(六)头文件的路径问题与属性管理器 19490

分类专栏

  • Visual Studio 8篇
  • 机器视觉
  • 模式识别

最新评论

  • VS2019 内联汇编开发

    R001: 请问下 X86编译正常 切换X64 装了clang-cl 但是报错了 error : invalid instruction mnemonic 'pushad' 这是什么原因啊

  • STM32 之 HAL 库串口 USART 丢数据及ORE卡死的解决方案

    可乐der加冰: 中断接收也会丢第一个数据,整的头皮发麻

  • VS2017的C++开发心得(十一)调试——内存溢出和内存泄漏(上)

    springontime: 你好我发现快照弄下来的变化是整个进程的内存变化,包含了堆和栈一大堆,很多都是栈的正常分配,有没有什么办法可以只过滤出堆分配

  • Stable Diffusion模型运算量分析

    会懵�: 请问stable diffusion 模型的MACs量和输入无关吗

  • VS2019 C++的跨平台开发——Android .so开发

    星辰北天: Visual Studio只能编译出这种动态/静态库吗? 如果我想直接编译这个,想直接用安卓sh运行该怎么配置? #include<stdio.h> int main() { printf("测试运行\n"); return 0; }

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Stable Diffusion模型运算量分析
  • ONNX模型tensor shapes inference和Flops统计工具
  • 基于NvidiaGPU的AI模型结构优化
2022年2篇
2021年2篇
2020年10篇
2019年14篇
2018年14篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司衡阳网站优化按天扣费哪家好哈密企业网站设计报价黄山网络营销价格合肥百姓网标王推荐池州百度竞价推荐扬州网站优化忻州百度竞价包年推广推荐天水网站优化按天计费报价荷坳网站设计模板公司昌吉网站优化按天扣费多少钱昌都网站制作设计报价防城港网站优化排名价格吕梁推广网站多少钱来宾百度竞价哈密关键词按天扣费公司陇南网站改版迪庆建设网站山南网站设计模板报价三亚网站改版价格贺州网站排名优化价格衡阳seo哪家好飞来峡网站推广推荐濮阳网站关键词优化推荐福州网站推广系统哪家好新乡网站制作设计多少钱珠海seo优化公司垦利英文网站建设价格潜江网站制作公司巢湖企业网站制作报价盐城外贸网站建设多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化