`
urey
  • 浏览: 24762 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
  • carmark: 做什么都好,自己喜欢就好,我是做Unix以及C和perl相关的 ...
    混沌。
  • urey: toeo 写道我大学 也是信息与计算科学的我现在是做java  ...
    混沌。
  • toeo: 我大学 也是信息与计算科学的我现在是做java  弄web.要 ...
    混沌。

visual studio中C语言调用汇编

阅读更多

视频编解码等高实时性软件也需要使用汇编编写某些代码来提高运行效率。

在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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics