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

相关文章推荐

VC内联汇编,引用程序中的变量

int a=5; //变量a _asm { mov eax,a; //将变量a的值放入寄存器eax add eax,eax; //相当于a=a+a mov ...

Windows 驱动:向 DbgPrintf 一样将调试信息输出到文件

运用的技术跟应用层大体一致,倒是互斥的问题干扰我很久。已开始使用的是 FastMutex,但是它会提升 IRQL 到 APC_LEVEL,显然写文件的服务函数都只能跑在 PASSIVE_LEVEL 下...

VC++ 安装驱动 源码

WDM式驱动源码: #include "stdafx.h" #include // Make all functions UNICODE safe. #include // for ...

vc内联汇编示例代码

  • 2004年07月28日 00:00
  • 18KB
  • 下载

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

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

在VC++中使用内联汇编

转自:http://www.98exe.net/Article/a/2006-11-05/2048.html 在VC++中使用内联汇编   作者:未知 文章来源:网络...

x264内联汇编

原文地址:http://blog.csdn.net/edcrfvzl/article/details/1604819 在x264.h中你可以观察到这样的语句: define DECLARE_ALI...

Linux 中 x86 的内联汇编

Bharata B. Rao (rbharata@in.ibm.com)IBM Linux 技术中心,IBM 软件实验室,印度 如果您是 Linux 内核的开发人员,您会发现自己经常要对...

Windows下用Visual Studio编译x64平台的内联汇编

原文地址:http://blog.csdn.net/ariesjzj/article/details/7085138 Linux下,GCC支持x86-32/64的内联汇编。Windows下,Visu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:X64下VC工程内联汇编
举报原因:
原因补充:

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