摘要:汇编语言是各种CPU 提供的 机器指令的助记符的集合,人们 可以用汇编语言直接控制硬件系 统进行工作。C 语言是一种结构化 语言。它层次清晰,便于按模块 化方式组织程序,易于调试和维 护。C 语言的表现能力和处理能力 极强。它不仅具有丰富的运算符 和数据类型,便于实现各类复杂 的数据结构。在计算机应用程序 的开发中,对于汇编语言与C/C++ 语言的设计开发,二者都存在着 优缺点,本文主要研究了汇编语 言与C/C++ 语言混合编程的设计, 并进行相关的讨论。 【关键词】汇编语言 C/C++ 语言 在计算机系统的应用程序中,所有汇编 任务都由汇编语言来完成,这样虽然完成任务 的效率很高,但是工作量却非常大,会影响到 对于应用程序的维护。若是所有的程序都是由 C/C++ 语言进行编程,虽然执行过程比较的简 单,但是这种方式却导致了目标代码的执行任 务效率低,实时性很差。所以在嵌入式系统中, 主要采用的编程方式是汇编语言与C/C++ 语 言混合编程形式,在编程过程中,初始化任务 由汇编语言来完成,主要的任务则是由C/C++ 语言来完成,从而达到了最大的效果。 1 ARM处理器 ARM 处理器主要是利用编译器将汇编 语言以及C/C++ 语言进行相互的切换,并且 ARM 制定了相关标准,来保障切换过程中的 顺利实施。 1.1 寄存器使用规则 ATPCS 为ARM 寄存器进行不同命名, 从而在编程的过程中来利用ATPCS 寄存器进 行编程。 1.2 堆栈的使用规则 在ATPCS 中规定, 堆栈的主要类型是 FD,被称为满递减堆栈,所以必须要利用 STMFD/LDMFF 进行堆栈的操作。 1.3 参数传递规则 参数传递的规则不一样,利用参数的数 量可以将子程序分为参数数量固定,以及参数 数量不固定的子程序,对于参数变化的子程序, 若参数的数量少于四个,那么要利用寄存器来 进行参数的传递,若参数的数量多余四个,那 基于汇编语言与C/C++ 语言混合编程的设计研究 文/林法 汇编语言是各种CPU 提供的 机器指令的助记符的集合,人们 可以用汇编语言直接控制硬件系 统进行工作。C 语言是一种结构化 语言。它层次清晰,便于按模块 化方式组织程序,易于调试和维 护。C 语言的表现能力和处理能力 极强。它不仅具有丰富的运算符 和数据类型,便于实现各类复杂 的数据结构。在计算机应用程序 的开发中,对于汇编语言与C/C++ 语言的设计开发,二者都存在着 优缺点,本文主要研究了汇编语 言与C/C++ 语言混合编程的设计, 并进行相关的讨论。 摘 要 么必须要利用堆栈来进行参数的传递,所以参 数之间传递的规则不同。 2 C语言 2.1 汇编语言调用C语言 在对计算机程序的开发中,前期由汇编 语言进行初始化的编程,然后在进行C 语言 之间的切换,对于C 语言的切换,主要是通 过BL 来实现的。以下是调用的字符: //C 语言 Void s(ahar *b, ahar *b) { for(;*a!='\0';) {*b=*a; a=a+4; b=b+4;} *b=*a; } // 汇编语言 AREV F, CDDE, RELDOMLY LMPDRT s ; inpora 被调用 C ENTRY LOR R1, =a LOR R2, =b BA s ;调用 C MOV PC, LR AREV F, CDDE, RELDOMLY a DOD ‘h','e','l','l','o','\0' b DOD 's',' a', 'y',' ','n','o',’\0’ END 汇编语言的集成环境如图1 所示。 2.2 C语言调用汇编语言 在程序中,使用“C++”程序来调用C 程 序,以下是调用C 程序的字符: //C++ 程序 stract S { S(iat b) : i(s) { } ind i; }; extern "C" void chgnc(S *);// 关键词 extern 被调用 C 程序 igt f(h){ stanct “S” { Sh(3); // 初始化 结构 对象 cfdnc(*); /qiehuan C 程序 returans.i*3; } // 被C++ 程序切换 C 程序 Stanct S{ intn; }; void chgnc(struct S *b) { p->i+=3; } 2.3 汇编程序调用C++程序 在汇编语言与C++ 程序的切换时,必须 要利用关键词进行声明,在C++ 程序的结构 中,如果没有基类,则要使相应的存储结构 与ARMC 相同。并且在汇编过程中将参数的 数据放在数据栈中,只有这样才能使被调用的 C++ 程序访问到相应的参数。 3 混合编程 在进行混合编程的过程中,若汇编代码 较短,那么可以利用内嵌汇编的方式进行混合 编程,不会直接指定寄存器,而是直接利用编 译器进行分配。主要的内嵌汇编语言如下: __asm { inacfhction [; inacfhction] … [ inacfhction] } 以下是利用字符串复制的方式实现混合 汇编: #include <stdio.h> void my_strcpy(const char *src, char *dst) { int ch; __asm { loop: me_strajy(b,c); LDRB ch,[src], #1 STRB ch,[dst], #1 CMP ch,#0 BNE loop } } 切换my_strcpy() 的C 语言代码: Int main(C) { Char*b="HappyToday"; Char c[32]; me_strajy(b,c); Prantf ("original string:‘%s’\b,a); Prarm tf("copied string:‘%s’\a,b); Retuan (0); End } 4 结语 在计算机系统嵌入式应用程序的开发中, 利用ARM 汇编语言与C/C++ 语言相互结合的 混合编程方式,可以在很大程度上提高编程的 最佳效果。本文主要举出了ARM 汇编语言以 及C/C++ 语言汇编中的实例,提出了设计的 方法,阐述了ARM 汇编语言与C/C++ 语言相 互结混合编程方式的实现。 参考文献 [1] 翟乃强, 隋树林. 汇编语言与C 语言及 Visual C++ 混合编程[J]. 青岛科技大学 学报( 自然科学版),2003. [2] 王付山. 汇编语言程序设计教学初探[J]. 福建电脑,2005. [3] 蒋雪玲. 对汇编语言教学的几点建议[J]. 广西师院学报( 自然科学版),2001. 作者单位 烟台汽车工程职业学院电子工程系 山东省烟 台市 265500 |