• 全国客户服务热线:4006-054-001 疑难解答:173-0411-9111(7X24受理投诉、建议、合作、售前咨询),155-4267-2990(售前),传真:0411-83767788,微信:543646
当前位置:主页 > 技术方案 > 环境传感

Visual C++中调用汇编语言的研究与实现

时间:2023-09-25 22:54来源: 作者: 点击:
>Visual C++中调用汇编语言的研究与实现

1 引言

   C++ 是当今最流行的软件开发工具之一,它可以可视化编程和支持面向对象的编程技术。人们在开发的过程中将两种语言进行混合编程,这种方法使两种语言相互,进行参数传递,共享数据结构和数据信息,充分发挥了各种语言的特点和优势,大大提高了应用软件的效率。因此,正确掌握 C++与的接口技术对软件开发是十分必要的。

  2 C++的常用方法

  通常有两种方法可以Visual C++。一种方法是在从C++语言中直接使用汇编语句,即嵌入式汇编;另一种方法是用两种语言分别编写独立的程序模块,汇编语言编写的源代码汇编产生目标代码OBJ文件,将C++源程序和OBJ文件组建工程文件,然后进行编译和连接,生成可执行文件.EXE。

  2.1 VC++中嵌入汇编语句的方法

  嵌入式汇编又称行内汇编,Visual C++提供了嵌入式汇编功能,允许在C++源程序中直接插入汇编语言指令的语句,可以直接访问C++语言程序中定义的常量、变量和函数,而不用考虑二者之间的接口,从而避免了汇编语言和C++语言之间复杂的接口问题,提高了程序设计效率。

  嵌入汇编语言指令采用__asm关键字,嵌入汇编格式:__asm{ 指令 },采用花括号的汇编语言程序段形式。具体应用通常采用两种方式,第一种方式:__asm { 汇编程序段 }, 如下所示:__asm

  {

  mov eax,5h

  mov ecx,7h

  add eax,ecx

  }

  另一种方式:每一条汇编语句前添加“__asm”标记,格式:__asm 汇编语句,如下所示:

  __asm mov eax,5h

  __asm mov ecx,7h

  __asm add eax,ecx

  在Turbo C环境中C语言程序含有嵌入式汇编语言语句时,C编译器首先将C代码的源程序(.c)编译成汇编语言源程序(.asm)。然后激活汇编程序Turbo Assembler将产生的汇编语言源文件编译成目标文件(.obj),最后激活Tlink将目标文件链接成可执行文件(.exe)。Visual C++ 中嵌入汇编语句的编译没有Turbo C那样复杂,它直接支持嵌入汇编方式,不需要独立的汇编系统和另外的连接步骤。因此Visual C++中嵌入汇编比Turbo C中嵌入汇编进行编译连接更为简单方便。

  2.2 采用模块调用的方法

  采用模块调用方式,要协调命名、调用、参数传递和返回等进行约定。

  (1) 采用一致的调用协议

  Visual C++语言具有三种调用协议:_cdecl、_stdcall和_fastcall。MASM汇编语言利用“语言类型”确定调用协议和命名约定,支持的语言类型有:C、SYSCALL、STDCALL、PASCAL、BASIC和FORTRAN。

  Visual C++与汇编语言混合编程通常利用堆栈进行参数传递,调用协议决定利用堆栈的方法和命名约定,两者要一致,通常Visual C++采用_cdecl调用协议,MASN汇编语言采用C语言调用协议。

  (2) 入口参数和返回参数的约定

  不论何种整数类型进行参数传递时都扩展成32位,Visual C++中没有远、近调用之分,所有调用都是32位的偏移地址,所有的地址参数也都是32位偏移地址,在堆栈中占4个字节。图1给出了采用C++语言调用协议的堆栈示意图。参数返回时,对于小于等于32位的数据扩展为32位,存放在EAX寄存器中返回;4-8个字节的返回值存放在EDX、.EAX寄存器中返回;更大字节数据则将它们的地址指针存放在EAX中返回。

  



>Visual C++中调用汇编语言的研究与实现
热门服务和内容