X64下VC工程内联汇编
来源:互联网 发布:手机淘宝分类在哪里 编辑:程序博客网 时间:2024/05/17 07:54
问题: 在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下VC工程内联汇编
- x64内联汇编调用API(需intel编译器,vc不支持x64内联汇编)
- x64内联汇编解决办法
- vc内联汇编
- vc内联汇编
- vc内联汇编
- x64平台下VC++中汇编函数的编写问题
- Windows下用Visual Studio编译x64平台的内联汇编
- VC之内联汇编代码...
- VC中使用内联汇编
- X86&&X64 汇编学习——内联基础
- VC内联ASM汇编学习笔记
- 源于网络 MSDN 翻译 VC++内联汇编
- VC++ 内联汇编函数调用方式
- VC内联汇编实现跳转调用
- VC++内联汇编(MSDN相关内容完整翻译)
- VC++内联汇编(MSDN相关内容完整翻译)
- VC内联汇编,引用程序中的变量
- iOS运行回路(RunLoop)总结
- 如何判断元素是否为HTMLElement元素
- noi2004 郁闷的收纳员 treap
- 简单实现了下SSDT SHADOW HOOK
- 基于visual Studio2013解决C语言竞赛题之0810链表去重
- X64下VC工程内联汇编
- hibernate中对象的3种状态----瞬时态、持久态、脱管态
- iPhone开发之自定义UIActionSheet
- Javascript中克隆一个数组的实现代码
- 深入浅出SQL Server 2008 分区函数和分区表
- hadoop常用链接备份
- PHP数组学习
- Install Timesys OS on simics with Intel Atom e6xx
- Ubuntu编译安装Keepalived