视频编解码等高实时性软件也需要使用汇编编写某些代码来提高运行效率。
在visual studio的C语言开发中,调用汇编有几点需要注意的地方
首先要区别MASM和MASM32,MASM是已经集成在visual studio中的汇编器,即汇编使用的ml.exe,可直接使用对已有的汇编代码进行汇编。MASM32是一套汇编的SDK,其安装和配置方法在sabalol的博文:
http://blog.csdn.net/sabalol/article/details/8739426
中已经说明较为详细,可以参考。
sabalol的博文也给出了在visual studio中进行汇编配置的一些说明,在我的实践中发现,实际使用中在链接器中设置相应需要include的目录,使得汇编能够找到引用的SDK的库文件,同时需要修改工程的生成自定义,勾选masm,使得visual studio可以调用masm汇编器。
在visual studio可以进行汇编之后,就涉及到在C语言中调用汇编函数的问题,在网上给出的很多实例均不能良好的运行,我也未深究其原因。
http://www.cs.virginia.edu/~evans/cs216/guides/vsasm.html
这一链接中给出的实例能够良好的运行,可以作为入门学习的范例,再在此基础上添加调用所需的接口或其他参数。
C语言部分为:
extern void clear(); int main() { clear(); return 1; }
若使用C++编译器,则声明部分需要修改为:
extern "C" { void clear(); }
汇编部分代码为:
.586 ;Target processor. Use instructions for Pentium class machines .MODEL FLAT, C ;Use the flat memory model. Use C calling conventions .STACK ;Define a stack segment of 1KB (Not required for this example) .DATA ;Create a near data segment. Local variables are declared after ;this directive (Not required for this example) .CODE ;Indicates the start of a code segment. clear PROC xor eax, eax xor ebx, ebx ret clear ENDP END
关于Intel汇编的学习发现一个比较完整的博文系列
http://fancymore.com/category/assembler.html
编写中遇到的一些问题:
1. 访问C语言全局变量:
使用EXTRN来指定变量名为全局变量,只声明不定义
2. PTR的使用:
PTR主要有两种用处,一个是指定访问存储的大小,另一个是指针定义
如:在将寄存器信息写入内存过程中指定大小 "movBYTE PTR [pstate], bl"
在汇编函数需要传入指针时:pstate:PTR BYTE
3. 汇编函数调用:
通过查看反汇编代码可以知道,在调用汇编函数时,直接使用call调用,问题在于没有进行现场保护
而调用C语言函数时,则会进行现场保护。
需要手动进行压栈操作保护现场以使得返回C语言函数后能够正常执行
需要保护的寄存器详见 http://blog.csdn.net/xiaominthere/article/details/17486129
4. 全局数据的访问:
全局变量在编译了之后是存储在静态存储区的,在程序中已经分配好了地址
若非指针可以直接在编译时获取其地址,可以采用如:
movzx ebx, BYTE PTR [OFFSET ff_h264_cabac_tables+ebx]
的方式获取全局数组中的值。
5. 汇编调用C语言函数
如第3点中所述,汇编调用函数需要进行手动压栈等操作,当调用C语言函数时,需要进行声明,
许多资料上写的声明是 EXTERN function:model model表示当前函数模式(near,far等),
在VS中声明为:
function proto C:type1,type2
详见链接:汇编调用C自定义程序的方法
6. 利用标志寄存器的条件指令
可以利用标志寄存器的状态来有条件的执行指令,目前使用过CMOVcc来依据条件转移数据。
有关标志寄存器参见:
http://www.cppblog.com/luqingfei/archive/2010/08/04/122171.aspx
有关汇编优化的帖子:http://www.newsmth.net/bbsanc.php?p=567-6-1-3
汇编与C语言混合编程教程:http://jpkc.zzu.edu.cn/hbyycai/courses/step.asp?id=14(难打开)
汇编调用C自定义程序的方法:http://blog.csdn.net/xietao1233/article/details/6724071
Urey‘s Factory
相关推荐
如何用Microsoft Visual Studio2010专业版进行C语言编写,本人讲解的很明白,适合初学者。
如何在visual studio 2010 中使用c语言
本实验要求在Visual DSP++ ADSP-BF535 Blackfin环境中编写一个简单的程序:C语言的主程序调用汇编语言的函数,完成简单的加法、减法。实验重点在于掌握汇编程序的调用方法,以及参数的传递,寄存器的数据存放。
如何在visual studio中使用c语言创建文档
本短篇教你如何在VISUAL STUDIO 中设置C语言编写操作,以及一些小问题
微软官方提供的Visual Studio 2010彻底卸载工具,本人已亲测。用它可以轻松彻底地删除Visual Studio 2010以及它诸多的依赖项,让你彻底从机器上删除Visual Studio 2010。支持Visual Studio 2010 各种版本。 微软官方...
Visual Studio 2017平台下,C++编写MathLibray dll,并在MathClient调用,内含sln工程文件。
因为这是一个离线的文件,需要安装到visual studio中,怎么操作呢? 也是有办法的,不能直接像普通的exe文件一样双击就可以安装,他需要利用visual studio环境下的vsixinstaller.exe可执行程序来安装。我们需要...
visual_stdio2010编写C语言使用教程
Visual Studio 2022 visualSvn 插件 亲测可用 如果你下载慢,就可以来这边下载。官方的下载速度太慢,真的等的没有耐心 VisualSVN is a professional grade Subversion integration plug-in for Visual Studio. Key...
本资源介绍了如何运用visual studio 2008写汇编程序的详细步骤。
支持vs2022汇编语法高亮插件
基于visual Studio2013解决C语言竞赛题之素数求和
Visual Studio扩展用于汇编文件和反汇编窗口中的汇编语法高亮显示和代码完成
使用visual studio编写C语言程序,输出hello
visual studio 2010汇编项目,兼容vs2013项目,是通过vs ide学习汇编语言的好项目
Oracle Developer Tools for Visual Studio 2019( ODT for VS 2019 19.3.0.0.0 (12 MB)) Download ODT for VS 2019, extract and run the VSIX file to install Oracle Developer Tools for Visual Studio 2019 ...
Visual C++ Redistributable for Visual Studio 2015 Visual C++ Redistributable for Visual Studio 2015
visual studio net初学者教程visual studio net初学者教程