X64下VC工程内联汇编

原创 2013年12月06日 16:13:32

问题: 在x64 Release下出现一个奇怪的bug,代码优化后一个浮点乘法运算出错了,例如1.0 × 1000 居然为 0。

分析:反汇编跟踪发现原来是寄存器的值传入有问题,本该传1000.0,结果传的是0.0。所用寄存器是xmm12,为什么会出现这个问题呢,发现是因为前面调用了

            libmpeg2的函数修改了xmm寄存器的值。根据windows x64调用约定,函数调用在使用xmm6-xmm15寄存器之前/之后,要保存/恢复xmm寄存器。

           libmpeg2库已经不更新了,所以只能在调用库函数之前和之后处理xmm寄存器的保存和恢复。

方案:x64已经不支持直接的内联汇编了,只能通过写汇编文件的方式来实现函数调用了。

            首先,需写一个汇编文件,里面包括两个函数,一个是保存xmm寄存器,另一个是恢复xmm寄存器,参数传递是通过RCX,这个可以参考调用约定。

            然后,设置工程,需先右键该工程,选择“生成自定义”选项,在弹出的对话框中选择编译器,如下图所以,此处使用的是yasm编译器

                       

           最后,添加该asm文件到工程中,右键该asm文件,在弹出的对话框中简单配置下,如下图所示

                    

           用extern声明asm中函数,在源文件中调用即可。

            注意c语言中不能在函数中间定义变量。

          

            x64调用约定参考:http://msdn.microsoft.com/zh-cn/library/ms235286%28v=vs.90%29.aspx

x64内联汇编解决办法

以前一直在x32上内联汇编用着好好的,五一换了电脑,win10 x64,想在一个点停下,结果在用__asm{}的时候vs2015报错说在本结构上不支持该拓展……一路慢慢Google vs2015...
  • iextract
  • iextract
  • 2017年05月02日 19:33
  • 1261

c++中调用64位汇编函数

众所周知从vs2005开始微软就不支持在c++中内联汇编了。会出现如下的错误 如果我们要在程序中内联汇编的话就要把汇编单独编译成一个文件,然后自定义规则生成obj,在链接的时候添加进去。 网上...
  • caschaoxin
  • caschaoxin
  • 2013年04月11日 19:46
  • 776

X64下VC工程内联汇编

问题: 在x64 Release下出现一个奇怪的bug,代码优化后一个浮点乘法运算出错了,例如1.0 × 1000 居然为 0。 分析:反汇编跟踪发现原来是寄存器的值传入有问题,本该传1000.0,结...
  • sanshui
  • sanshui
  • 2013年12月06日 16:13
  • 1125

VC++内联汇编(MSDN相关内容完整翻译)

VC++内联汇编(MSDN相关内容完整翻译) VC++内联汇编,将MSDN里面关于内联汇编的几乎全翻译了,一上午的成果啊,哪翻译错了,告我一声啊。。。 【一】.在 __asm bloc...
  • cosmoslife
  • cosmoslife
  • 2012年07月06日 00:06
  • 731

VS2012下X64平台嵌入汇编程序

VS2012在win32平台编译的时候可以很好的支持汇编语言的嵌入。建立一个控制台应用程序,选择空项目。项目建立好之后添加一个.cpp文件。在cpp文件中写入如下代码: #include usi...
  • Robin__Chou
  • Robin__Chou
  • 2015年12月12日 15:43
  • 7381

x64内联汇编调用API(需intel编译器,vc不支持x64内联汇编)

#include "stdafx.h" #include STARTUPINFOW StartInfo = {0}; PROCESS_INFORMATION pi = {0}; TCHAR sz...
  • zwfgdlc
  • zwfgdlc
  • 2013年12月21日 15:43
  • 2437

vs64位下不能内嵌汇编

只能建个.asm文件,然后在生成规则里加上masm,注意得重新加asm文件到工程才能生效...
  • esrrhs
  • esrrhs
  • 2014年09月25日 22:58
  • 374

内联汇编

1. 内联汇编
  • ahoo110
  • ahoo110
  • 2016年06月02日 23:45
  • 159

x86平台转x64平台关于内联汇编不再支持的解决

2011/08/25   把自己碰到的问题以及解决方法给记录下来,留着备用!  工具:VS2005  编译器:cl.exe(X86 C/C++)  ml64.exe(X64 ASM64) ...
  • dj0379
  • dj0379
  • 2013年11月14日 13:47
  • 2874

如何在各个版本的VC及64位下使用CPUID指令

感谢这位楼主无私奉献http://blog.csdn.net/zyl910/article/details/7588204 前面我们探讨了在16位的DOS实模式下使用CPUID指令(http://w...
  • xiaopang1122
  • xiaopang1122
  • 2016年11月11日 15:29
  • 462
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:X64下VC工程内联汇编
举报原因:
原因补充:

(最多只允许输入30个字)