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++ 语言与汇编语言的无缝结合。
本文由 伯特利数控文章 整理发表,文章来自网络仅参考学习,本站不承担任何法律责任。
/bethel/news/
带你了解--标准COD消解器使用方法
大型龙门加工中心-新品推荐
浮游菌采样器的相关操作说明
民族医院小型污水处理设备
自动折盖封箱机的性能特点
谈谈Visual C++ 和汇编语言混合编程上的优化
芜湖带双色报警灯秤/兴化60吨汽车衡/洪泽120吨吊秤/通州15T吊秤
什么原因造成信号防雷器泄漏电流超标?
综合型发动机分析仪的优势在哪里?
金锋锯业双金属带锯条,锯切作用大
新开发的分析技术:偏振X射线用于荧光分析
艾德克斯Itech双向可编程直流电源
现货优势DYM-3A平原型数显气压计
使用MicroTester评估组织球体(TS)的机械性能
GEC2010三相多功能电力仪表技术咨询
色谱样品瓶使用注意事项
5kw*柴油发电机
熔喷布设备高压风机的维护保养非常重要
二手降膜蒸发器简介工艺流程
自动称重机无法称重解决方法