1 Visual C++ 调用汇编语言的常用方法混合编程的关键是解决好高级语言与汇编语言的接口问题, 可采用两种方法: 一是使用嵌入式汇编, 即在高级语言的语句中直接使用汇编语句, 这种方法比较简洁直观,但功能较弱; 另一种方法是独立编程,分别产生各自的目标文件,然后经过连接, 形成一个完整的程序。采用这种方法比较灵活而且还具有很强的功能, 其关键是如何解决好汇编语言与高级语言的数据通讯。本文就以在凌阳 16 位单片机SPCE061A 中[ 2],采用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++ 中调用汇编程序的实例:
P P Visual C++ 语言主函数main ( )
void F- Sub ( void) ; P P 声明要调用的函数的函数原型,此函数无参数传递
intmain ( void) {
while ( 1)
F- Sub ( ) ; P P 调用汇编函数
return 0;
}
P P 汇编子函数F- Sub( )
. CODE
. PUBL IC- F- Sub
- F- Sub:
NOP
RETF
以上程序在凌阳公司提供的集成开发环境下编译连接后即可运行。
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 说明。
1. 3 模块调用混合编程的实现步骤
采用模块调用方式进行混合编程一般执行的步骤如下: ( 1)建立Visual C++ 源程序( . cpp) ; ( 2)建立汇编语言源程序, 并把汇编语言汇编成. obj 文件;( 3)建立工程文件. prj, 将Visual C++ 源程序和. obj文件放入该工程项目; ( 4) 对工程文件进行编译、 连接, 生成可执行文件. exe。
在与Visual C++ 混合编程的汇编语言过程中,编程环境是32位的,应该注意与16 位MS -DOS 环境的区别。在这种环境下的寄存器是32位的, (下转第160页)(上接第 124 页)因此汇编语言过程存取堆栈应该使用32 位寄存器EBP 进行相对寻址, 而不是采用 BP。汇编语言简化段定义的格式应该采用flat 模式, 并且汇编时采用选项P coff, ML命令的选项P coff 使得产生的. obj 文件采用32位的格式。
2 在 Visual C++ 中调用汇编语言的
第三种方法
通常以上两种方法就能够实现 Visual C++ 语言与汇编语言混合编程, 但是在一些特殊的情况下,用这两种方法却不能满足功能的需要, 本文提出了一种新的方法) ) ) 通过数组借助指针实现二者的混合编程。下面结合所开发的课题) ) ) 数控系统逻辑控制系统软件开发, 来进行具体说明[ 3 ]。
该课题是在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++ 语言与汇编语言的无缝结合。
2021-09
星瀚系列是宇匠数控打造的颠覆性产品,在高精度加工的情况下保证高速、高刚的特性,是真正意义的高速加工中心,其性能及质量可媲美进口高速加工中心。同时可配置超声波系统与石墨集尘系统,亦可运用在陶瓷等硬脆料、石墨等高粉尘料的加工;… [了解更多]
2021-09
星瀚S系列是宇匠数控打造的颠覆性产品,采用全闭环设计,在高精度加工的情况下保证高速、高刚的特性,是真正意义的高速加工中心,其性能及质量可媲美进口高速加工中心。同时可配置超声波系统与石墨集尘系统,亦可运用在陶瓷等硬脆料、石墨等高粉尘料的加工;… [了解更多]
2021-09
TC系列超声波陶瓷雕铣机,是利用了超声波高频振动原理作用于刀具,使刀具产生了16KHz-40KHz(每秒16000-40000次)的连续高强度脉冲冲击,带动磨头冲击工作。当工件的局部应力远远超过材料脆裂极限,材料局部破碎去除。 适用范围 特别适用于陶瓷(氧化锆、氧化铝、氮化铝… [了解更多]
2020-10
1 问题的提出数控加工夹具是数控CNC机械制造加工过程中用来 固定加工对象,使之占有正确的位置,以满足加工工艺条件、迅速、方便、安全地安装工件的装置。夹具通常由定位元件、夹紧装置 、对刀引导元件、分度装置、连接元件及夹具体等组成[1]。图1所示零件是应用于系列矿用防爆电器产品上的… [了解更多]
2019-09
0 引言 动梁龙门移动式加工中心适用于航空、重机、机电、造船、发电、核电、机床、印刷、轻纺、模具制造行业半精加工和精加工,也能用于粗加工。为了防止在加工中动梁重心偏移而影响加工精度和产品质量,大森公司研制开发 16i-g 系统用于威海华东数控动梁龙门移动式镗铣XKW2850 机… [了解更多]