`
urey
  • 浏览: 26002 次
  • 性别: 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

 

 

分享到:
评论

相关推荐

    调用汇编代码_me.rar_C 调用 汇编_VC 中嵌入汇编_VC 汇编_汇编语言

    1. **C语言调用汇编函数** 在C程序中调用汇编函数通常是通过定义一个外部汇编函数来实现的。首先,我们需要编写一个汇编源文件(例如:asm_func.asm),其中包含汇编函数的定义。然后,使用汇编器(如Microsoft的...

    C语言内嵌arm汇编

    - 内联汇编:C语言中的`asm`关键字(在GCC编译器中)或`__asm__`(在Visual Studio中)用于内嵌汇编代码。这使得开发者可以在C程序中直接插入汇编语句,执行特定的硬件操作,如内存访问、计算或中断处理。 2. **...

    Visual Studio 2015 编译 objective-c

    这种方式可以解决Objective-C语言中特有的某些特性无法在Visual Studio 2015上直接运行的问题。 视频内容中提到的HTML和JavaScript代码片段则可能是用来展示如何在Visual Studio 2015中创建混合应用程序。这意味着...

    C语言调用obj文件中的函数源代码

    本篇文章将深入探讨如何在C语言程序中调用.obj文件中的函数,以及这一过程涉及的相关技术。 首先,我们需要理解.obj文件是什么。.obj文件是对象文件,它是源代码经过编译器处理后的结果,但还没有链接到最终的可...

    cl命令-编译c语言汇编程序

    标题中的"cl命令-编译C语言汇编程序"指的是使用Microsoft Visual Studio的编译器cl.exe来处理C语言源代码,并将其转化为汇编语言,最终生成可执行文件的过程。这个过程是软件开发中的一个重要环节,涉及到编程语言的...

    汇编环境配置 及部分所需要的文件

    在描述中提到的"帮助在visual c++下配置汇编编译环境",意味着我们将利用Visual Studio(尤其是Visual C++)的集成开发环境(IDE)来设置这个环境。Visual Studio虽然以C++为主,但通过添加额外的组件,也可以支持...

    WIN32 C 与 ASM 混合编程

    - Windows操作系统提供了大量的API函数,用于创建窗口、管理输入输出、处理消息等,这些函数可以用C语言调用。 - 在C语言代码中调用WIN32 API,可以通过包含头文件如`windows.h`来实现。 4. **混合编程的实现**:...

    C语言基础-从零开始初识C语言

    此外,C语言中的函数是代码复用的关键,学习如何定义和调用函数至关重要。 数组是C语言中存储一组相同类型数据的结构,了解数组的声明、初始化和操作是中级C语言学习的一部分。C语言还有指针的概念,它允许直接访问...

    汇编语言程序设计课程实验三1

    通过实验,学生应能熟练运用汇编语言编写函数,理解C语言调用汇编函数的过程,以及了解不同编程语言间的接口规则。此外,还需熟悉特定的开发环境,例如使用调试工具,分析编译器的符号命名规则。 实验内容: 实验...

    c语言获取 CPU序列号(CPUID) 硬盘序列号 (vs2010工程)支持64位编译

    4. **VS2010工程**:Visual Studio 2010是微软的集成开发环境(IDE),支持C++和C语言的开发。此项目使用VS2010,意味着代码遵循C++标准,并且能利用其调试、构建和测试工具。 5. **64位编译**:随着64位系统的普及...

    C语言编译软件 TC3.0

    虽然现在有更多现代化的IDE,如Visual Studio、Code::Blocks等,但TC3.0的经典地位和简易性使其在教学和学习C语言时仍具有一定的价值。通过深入理解和熟练使用TC3.0,可以更好地掌握C语言的基础知识和编程技巧。

    在C 中内嵌汇编.docx

    例如,上述示例以Visual Studio 2005为例,但在其他编译器环境下可能需要调整。 - **可读性和维护性**:虽然内嵌汇编可以显著提高性能,但它可能会降低代码的可读性和维护性。在实际应用中需要权衡这些因素。 #### ...

    WMI-64- c语言 获取 CPU序列号 CPUID,硬盘序列号 支持64位编译

    在C语言中,可以通过汇编语言代码或者特定的库函数来执行CPUID指令,从而获取CPU相关信息。 【硬盘序列号】是硬盘的唯一标识,类似于CPU序列号,它在硬盘生产时被固化在硬盘控制器上。获取硬盘序列号同样可以通过...

    C语言简明教程(中文)

    - **C/C++程序开发运行环境**包括但不限于GCC、Code::Blocks、Visual Studio等。这些工具提供了编译器、调试器以及集成开发环境(IDE)等功能。 - **格式输出函数printf()和格式输入函数scanf()**是C语言中常用的函数...

    2022年c语言课程设计总结范文汇编.docx

    3. **上机实践**:上机实验是C语言学习的重要环节,它让学生在实际环境中熟悉开发环境(如GCC或Visual Studio),学习如何编辑、编译、链接和运行C程序。此外,通过不断的上机实践,学生可以提升对错误排查和程序...

    c语言中所用的TC 软件

    随着计算机技术的发展,TC逐渐被更现代的IDE如Visual Studio、Code::Blocks、GCC等取代。然而,对于初学者来说,TC仍然是一个了解C语言基础知识的良好起点,它的简洁性和灵活性有助于理解编程的基本原理。

    C语言获取CPU的ID号

    在提供的压缩包文件中,`CPU.CPP`应该是实现上述功能的源代码,`CPU.dsp`和`CPU.dsw`是Visual Studio的项目文件,`CPU.ncb`是Visual Studio的解决方案数据库,`CPU.opt`是编译选项文件,`CPU.plg`是编译日志,而`...

    实验报告1

    使用集成开发环境(IDE)如Visual Studio或GCC的调试工具,设置断点并逐步执行C语言程序,同时观察反汇编窗口中的汇编代码,对比分析C语言语句与对应的汇编指令。 实验记录与分析: 通过实验,学生应能够识别基本的...

Global site tag (gtag.js) - Google Analytics