当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]Visual C++中调用汇编语言的研究与实现

1 引言

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

  2 Visual 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中返回。

  

[!--empirenews.page--]

 

  (3) 声明公用函数名和变量名

  对Visual C++和汇编语言使用的公用函数和变量应该进行声明,并且标识符应该一致,C++语言对标识符区分字母的大小写,而汇编不区分大小写。在Visual C++语言程序中,采用extern “C”{ }对所调用的函数和变量给予说明。说明形式如下:

  对函数的说明:extern “C” { 返回值类型 调用协议 函数名称(参数类型表);}

  对变量的说明:extern “C” { 变量类型 变量名;}

  汇编语言程序中供外部使用的标识符应该标识PUBLIC属性,使用外部标识符应该用extern说明。

  2.3 模块调用混合编程的实现步骤

  采用模块调用方式进行混合编程一般执行的步骤如下:(1)建立C++源程序(.cpp);(2)建立汇编语言源程序,并把汇编语言汇编成.obj文件;(3)建立工程文件.prj,将C++源程序和.obj文件放入该工程项目;(4)对工程文件进行编译、连接,生成可执行文件.exe。

  在与Visual C++混合编程的汇编语言过程中,编程环境是32位的,应该注意与16位MS-DOS环境的区别,在这种环境下的寄存器是32位的,因此汇编语言过程存取堆栈应该使用32位寄存器EBP进行相对寻址,而不是采用BP。汇编语言简化段定义的格式应该采用flat模式,并且汇编时采用选项/coff,ML命令的选项/coff使得产生的.obj文件采用32位的格式。

  3 在Visual C++中调用汇编语言的第三种方法

  通常以上两种方法就能够实现C++与汇编语言混合编程,但是在一些特殊的情况下,用这两种方法却不能满足功能的需要,我们提出了一种新的方法实现二者的混合编程:通过数组借助指针实现二者的混合编程。下面结合我们开发的课题――数控系统逻辑控制系统软件开发,来进行具体说明。

  该课题在Visual C++ 6.0的环境下进行开发的,上层采用C++语言,最底层采用了汇编语言,在C++语言中要调用汇编语言的编译的结果,并进行回填,如果用通用的混合编程方法无法实现二者的调用,因为底层汇编语言是把所有的逻辑运算功能指令汇编在一起,而在C++语言中根据需要在需要的地方调用汇编语言中的某一功能模块,因此对汇编语言编译后的.OBJ文件无法进行控制。具体实现方法如下:

  (1)把包括所有的逻辑指令的汇编语句编成一个汇编模块程序,在汇编编译器(如masm 6.x)中将汇编程序编译成.OBJ文件。

  (2)将汇编生成的机代码放在一个数组中,

  例如定义一个数组变量unsigned char OBJMOD[1241]。

  (3)定义多个指针类型变量指向OBJMOD数组元素的地址,该地址对应每个汇编功能模块的首地址,如定义一个指针变量unsigned char *LIBC21=&OBJMOD[869]。

  (4)通过函数COPILE(*pModal)模块,例如编译汇编LIBC21功能模块时,通过调用COPILE(LIBC21) 函数,把汇编编译生成的机代码分别传递到工作区域WKAREA中,通过WKAREA[POSIRR]=BUFRIS[PTRIS]来实现二次填充,把汇编机代码中改写的内容改写成需要的地址或值,最后通过调用一系列函数,把结果保存到文件中。

  本课题采用这种方法实现了C++和汇编语言的混合编程,从而实现C++语言与汇编语言的无缝结合。

  4 结束语

  Visual C++和汇编语言混合编程可以实现优势互补,尤其用在高级语言开发底层软件方面,例如用Visual C++6.0环境开发数控软件PLC的控制功能,这种优势更为明显,具有很好的实际应用价值。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭