海天精工机床有限公司 海天精工博客

浅淡汇编语言在Visual C++ 中常用编程方法及设计优化

0 引言在平常编写程序时, 一般都希望选择VC++ 、Visual Basic 等这样的可视化高级语言来编写, 这些语言工具可以实现可视化编程和支持面向对象的编程技术,同时它们的语法更接近于自然语言, 表达能力强, 使用灵活,具有强大的库函数, 更重要的是与机器无关, 可移植性好, 这样程序开发周期比较短,省时省力。但在某些部分,例如程序的关键部分、 运行次数很多的部分、 运行速度要求很高的部分或直接访问硬件的部分等利用汇编语言编写, 可以提高程序的运行效率和速度, 但如果只用汇编语言编程的话是比较繁琐的, 对于一个比较大的程序来说编写起来将非常耗时, 开发周期较长。为了满足既能缩短程序开发周期, 又能保证程序的执行效率两方面的要求, 采用VC++ 语言和汇编语言混合编程的技术,即程序的框架或主体部分用Visual C++ 语言编写,而要求执行效率高的部分用汇编语言编写。加工中心请选择 海天精工1 Visual C++ 调用汇编语言的常用方法混合编程的关键是解决好高级语言与汇编语言的接口问题, 可采用两种方法: 一是使用嵌入式汇编, 即在高级语言的语句中直接使用汇编语句, 这种方法比较简洁直观,但功能较弱; 另一种方法是独立编程,分别产生各自的目标文件,然后经过连接, 形成一个完整的程序。采用这种方法比较灵活而且还具有很强的功能, 其关键是如何解决好汇编语言与高级语言的数据通讯。本文就以在凌阳 16 位单片机SPCE061A 中,采用Visual C++ 与汇编语言独立编程的方式实现混合编程的具体方法并给出实例。钻攻中心请选择 海天精工1. 1 VC++ 中嵌入汇编语句的方法嵌入式汇编又称行内汇编, Visual C++ 提供了嵌入式汇编功能, 允许在VC++ 源程序中直接插入汇编语言指令的语句, 可以直接访问VC++ 语言程序中定义的常量、 变量和函数,而不用考虑二者之间的接口,从而避免了汇编语言和VC++ 语言之间复杂的接口问题, 提高了程序设计效率。嵌入汇编语言指令采用- - asm 关键字, 嵌入汇编格式: - - asm{指令} , 采用花括号的汇编语言程序段形式。具体应用通常采用两种方式, 第一种方式: - - asm{汇编程序段} ,如下所示: - - asm{ mov ea x, 5h mov ec x, 7h add eax, ecx}另一种方式:每一条汇编语句前添加/ - - asm0标记,格式: - - asm 汇编语句,如下所示:- - asm mov ea x, 5h- - asm mov ec x, 7h- - asm add eax, ec x在Visual C++ 编译环境中VC++ 语言程序含有嵌入式汇编语言语句时, 编译器首先将VC++ 代码的源程序( . cpp)编译成汇编语言源程序( . asm)。然后激活汇编程序, Turbo Assembler 将产生的汇编语言源文件编译成目标文件( . obj) , 最后激活Tlink 将目标文件链接成可执行文件( . exe)。Visual C++ 直接支持嵌入汇编方式, 不需要独立的汇编系统和另外的连接步骤。所以Visual C++ 中嵌入汇编比Tur -bo C 中嵌入汇编进行编译连接更为简单方便。以下是在VC++ 中调用汇编程序的实例:// Visual C++ 语言主函数main ( )void F- Sub ( void) ; // 声明要调用的函数的函数原型,此函数无参数传递intmain ( void) { while ( 1) F- Sub ( ) ; // 调用汇编函数return 0;}// 汇编子函数F- Sub( ). CODE. PUBL IC- F- Sub- F- Sub:NOPRETF以上程序在凌阳公司提供的集成开发环境下编译连接后即可运行。1. 2 采用模块调用的方法采用模块调用方式, 要协调命名、 调用、 参数传递和返回等进行约定。( 1) 采用一致的调用协议Visual C++ 语言具有三种调用协议: - cdecl,- stdcall和- fastcal l。MASM 汇编语言利用/ 语言类型0确定调用协议和命名约定, 支持的语言类型有:C, SYSCALL, STDCALL,PASCAL, BASIC 和FOR TRAN。Visual C++ 与汇编语言混合编程通常利用堆栈进行参数传递,调用协议决定利用堆栈的方法和命名约定, 两者要一致, 通常Visual C++ 采用- cdecl调用协议, MASN 汇编语言采用Visual C++ 语言调用协议。( 2) 入口参数和返回参数的约定不论何种整数类型进行参数传递时都扩展成32位,Visual C++ 中没有远、 近调用之分, 所有调用都是 32 位的偏移地址, 所有的地址参数也都是32位偏移地址, 在堆栈中占4 个字节。图1 给出了采用Visual C++ 语言调用协议的堆栈示意图。参数返回时,对于小于等于32 位的数据扩展为32 位,存放在EAX 寄存器中返回; 4- 8 个字节的返回值存放在EDX, EAX 寄存器中返回;更大字节数据则将它们的地址指针存放在EAX 中返回。( 3) 声明公用函数名和变量名对Visual C++ 和汇编语言使用的公用函数和变量应该进行声明, 并且标识符应该一致, C++ 语言对标识符区分字母的大小写,而汇编不区分大小写。在Visual C++ 语言程序中, 采用extern / C0{ }对所调用的函数和变量给予说明。说明形式如下:对函数的说明: extern / C0 { 返回值类型 调用协议 函数名称(参数类型表) ; }对变量的说明: extern / C0 { 变量类型变量名; }汇编语言程序中供外部使用的标识符应该标识P UBLIC 属性,使用外部标识符应该用 e xtern 说明。CNC加工中心 请选择 海天精工1. 3 模块调用混合编程的实现步骤采用模块调用方式进行混合编程一般执行的步骤如下: ( 1)建立Visual C++ 源程序( . cpp) ; ( 2)建立汇编语言源程序, 并把汇编语言汇编成. obj 文件;( 3)建立工程文件. prj, 将Visual C++ 源程序和. obj文件放入该工程项目; ( 4) 对工程文件进行编译、 连接, 生成可执行文件. exe。在与Visual C++ 混合编程的汇编语言过程中,编程环境是32位的,应该注意与16 位MS -DOS 环境的区别。在这种环境下的寄存器是32位的,因此汇编语言过程存取堆栈应该使用32 位寄存器EBP 进行相对寻址, 而不是采用 BP。汇编语言简化段定义的格式应该采用flat 模式, 并且汇编时采用选项P coff, ML命令的选项P coff 使得产生的. obj 文件采用32位的格式。2 在 Visual C++ 中调用汇编语言的第三种方法通常以上两种方法就能够实现 Visual C++ 语言与汇编语言混合编程, 但是在一些特殊的情况下,用这两种方法却不能满足功能的需要, 本文提出了一种新的方法) ) ) 通过数组借助指针实现二者的混合编程。下面结合所开发的课题) ) ) 精工系统逻辑控制系统软件开发, 来进行具体说明。该课题是在Visual C++ 6. 0 的环境下进行开发的,上层采用VC++ 语言, 最底层采用了汇编语言,在VC++ 语言中要调用汇编语言的编译结果, 并进行回填,用通用的混合编程方法无法实现二者的调用,因为底层汇编语言是把所有的逻辑运算功能指令汇编在一起, 而在VC++ 语言中根据需要在需要的地方调用汇编语言中的某一功能模块, 因此对汇编语言编译后的. obj 文件无法进行控制。具体实现方法如下:( 1)把包括所有的逻辑指令的汇编语句编成一个汇编模块程序,在汇编编译器(如masm 6. x)中将汇编程序编译成. obj文件。(2) 将汇编生成的机代码放在一个数组中, 例如定义一个数组变量unsigned char OBJMOD[ 1241]。( 3)定义多个指针类型变量指向OBJMOD 数组元素的地址,该地址对应每个汇编功能模块的首地址,如定义一个指针变量 unsigned char * LIBC21=&OBJMOD[ 869]。( 4) 通过函数COPILE( * pModal) 模块, 例如编译汇编 LIBC21 功能模块时, 通过调用 COPI LE( LIBC21)函数,把汇编编译生成的机代码分别传递到工作区域WKAREA 中, 通过 WKAREA[ POSIRR]= BUFRIS[ PTRIS] 来实现二次填充,把汇编机代码中改写的内容改写成需要的地址或值,最后通过调用一系列函数, 把结果保存到文件中[ 4 ]。高速加工中心 请选择 海天精工3 寄存器的使用约定在所有寄存器中, BP 应首先引起注意,因为一旦进入汇编程序, BP 的内容在子程序入口处被压入栈内,并且栈指针( SP)的当前值必须放在BP 中,在子程序出口处BP 被弹出,恢复原来的值。4 结束语采用两种或两种以上的编程语言混合编程, 彼此相互调用,进行参数传递, 是一种有效的程序设计方法。这种方法可以充分发挥各种语言的优势,充分利用现有的实用程序,是当前编程技术的一个重要研究和应用领域。本课题采用该方法实现了Visual C++ 和汇编语言的混合编程,从而实现Visual C++ 语言与汇编语言的无缝结合。本文由海天精工整理发表,文章来自网络仅参考学习,本站不承担任何法律责任。http://www.shljchina.com/加工中心 高速加工中心 钻攻中心 CNC加工中心 请选择 海天精工
留言列表
发表留言
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。