关于Visual Studio 不支持x64 内联汇编分析

记录一下今天的大坑,实在是有必要记录一下

调程序发现参数在函数传递时,出现了异常的值,已经确认不是指针破坏的问题。用汇编看了下,发现汇编寄存器地址都取错了,在release开启o2优化时出现,关掉又正常,实在是百思不得其解。

对于内联汇编,其实很多人简单的就能想到__asm这样嵌入进去的代码。但后来我仔细找了下,发现内含的函数,与__asm 所体现的形式完全一致,但编译器只禁止了x64内联 __asm,却没禁止内含函数。例如winnt.h中的__readgsqword之类的。通过#pragma intrinsic(myfunc) 所定义,具体可以参考#pragma的详细用法_寂寂寂寂寂蝶丶的博客-CSDN博客#pragma的详细用法转载自:https://www.cnblogs.com/azraelly/archive/2012/07/05/2577334.html每种C和C++的实现支持对其宿主机或操作系统唯一的功能。例如,一些程序需要精确控制超出数据所在的储存空间,或着控制特定函数接受参数的方式。#pragma指示使每个编译程序在保留C和C++语言的整体兼容性时提供不同机器和操作系统特...https://blog.csdn.net/SwordArcher/article/details/81387114这详细介绍了#pragma intrinsic 指令,看了之后终于晓得了问题的根本原因所在。首先是

Visual Studio 不支持x64 vc中内联汇编的原因 - 简书Visual Studio目前只支持32位(x86)的内联汇编,而不支持64位(x64)下的内联汇编,在x64下编译的话,会报错 “使用了非标准扩展: 不支持在此结构上使用“...https://www.jianshu.com/p/289e1324836a看了发现微软并没有给出原因,说为何不支持x64的内联汇编,但目前猜测,是与o2优化这种问题相关的原因所导致的。

解决方案:找到了原因,解决起来就特别简单,只需要找到 调用内含函数的函数,加上__declspec(noinline) 即可

顺带一说,调用内含函数需特别注意这个问题,因为编译器不会报错,编译器居然也没有禁止,而且没什么现象,特别难找,环境是vs2019,官方说vs2022已修复这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值