版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编与C/C+的混合编程,要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐 应该采用过程调用伪指令INVOKE 使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明,过程声明和过程调用伪指令,过程名PROC调用距离 语言类型 作用范围 USES 寄存器列表, 参数:类型 LOCAL 参数表 ;汇编语言语句 过程名ENDP,过程声明伪指令:用于事先声明过程的结构 过程名PROTO 调用距离 语言类型, 参数:类型 过程调用伪指令 INVOKE 过程名,参数,.,如何调用,调用距离,调用距离可以是NEAR16、NEAR32、FAR,表示该过程是近或远调用。简化段格式中,
2、缺省值由.model语句选择的存储模式决定。,语言类型,语言类型可以是任何有效的语言类型,确定该过程采用的命名约定和调用约定;语言类型还可以由.model伪指令指定,作用范围,作用范围可以是PUBLIC、PRIVATE、EXPORT,表示该过程是否对其他模块可见。缺省是PUBLIC,表示其他模块可见;PRIVATE表示对外不可见;EXPORT隐含有PUBLIC和FAR,表示该过程应该放置在导出表(export entry table)。,起始参数,起始参数采用这个格式的PROC伪指令,汇编系统将自动创建过程的起始代码(Prologue code)和收尾代码(Epilogue code),用于传
3、递堆栈参数以及清除堆栈等。起始参数表示传送给起始代码的参数;它必须使用尖括号“”括起来,多个参数用逗号分隔。,寄存器列表,寄存器列表指通用寄存器名,用空格分隔多个寄存器。只要利用“USES 寄存器列表”罗列该过程中需要保存与恢复的寄存器,汇编系统将自动在起始代码产生相应的入栈指令,并对应在收尾代码产生出栈指令。,参数,参数类型表示过程使用的形参及类型。在16位段中,缺省的类型是字WORD,在32位段中缺省的类型是双字DWORD。 参数类型可以是任何MASM有效的类型或PTR(表示地址指针);在C、SYSCALL、STDCALL语言类型中。 PROC伪指令中使用参数,必须定义语言类型。,局部变量
4、,如果过程使用局部变量,紧接着过程定义伪指令PROC,可以采用一条或多条LOCAL伪指令说明。 其中,可选的“个数”表示同样类型数据的个数,类似数组元素的个数。在16位段中,缺省的类型是字WORD,在32位段中缺省的类型是双字DWORD。使用LOCAL伪指令说明局部变量后,汇编系统将自动利用堆栈存放该变量.,例fig6-20new.asm,此例该自fig6-20.asm,请注意比较。,.386 .MODEL FLAT, stdcall ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD Move PROTO NEAR32 C, :WORD, :
5、BYTE, :BYTE, :BYTE include io.h ; header file for input/output cr equ 0dh ; carriage return character Lf equ 0ah ; line feed,.STACK 4096 ; reserve 4096-byte stack .DATA ; reserve storage for data prompt BYTE cr,Lf,How many disks? ,0 number BYTE 16 DUP (?) count word ? message BYTE cr,Lf,Move disk fr
6、om spindle source BYTE ? BYTE to spindle dest BYTE ? BYTE .,0,.CODE Move PROC NEAR32 c uses eax ebx, countp:word, Sr:byte , Dst:byte, Spa: byte cmp countp , 1 ; NbrDisks = 1? jne elseMore ; skip if more than 1 mov bx,word ptr Sr ; Source mov source,bl ; copy character to output mov bx,word ptr Dst ;
7、 destination mov dest,bl ; copy character to output output message ; print line jmp endIfOne ; return elseMore: dec countp INVOKE Move, countp, Sr, Spa, Dst INVOKE Move, 1, Sr, Dst, Spa INVOKE Move, countp, Spa, Dst, Sr endIfOne: ret ; return Move ENDP,start: output prompt ; ask for number of disks
8、input number,16 ; read ASCII characters atoi number ; convert to integer INVOKE Move, ax, A, B, C INVOKE ExitProcess, 0 ; exit with return code 0 PUBLIC start ; make entry point public END ; end of source code,列表文件,什么是混合编程,多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程 程序的大部分采用高级语言编写,以提高程序的开发效率;在某些
9、部分,利用汇编语言编写,以提高程序的运行效率,混合编程方法,嵌入式汇编 在C/C+语言中直接使用汇编语言语句, 简洁直观、功能较弱 模块连接 两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序 使用灵活、功能强,要解决参数传递问题,混合编程的关键问题,建立不同语言之间的接口 在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言调用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正确使用,Turbo C嵌入式汇编方式,格式 asm 操作码 操作数 举例 asm mov ax,ds; asm pop ax; as
10、m pop ds; asm ret; asm push ds,若干注意事项,操作码支持8086/8087指令或若干伪指令:db/dw/dd和extern 操作数是操作码可接受的数据:立即数、寄存器名,还可以是C语言程序中的常量、变量和标号等 内嵌的汇编语句可以用分号“;”结束,也可以用换行符结束 使用C的注释,如 / * * / 正确运用通用寄存器、标号等,/ * LT702.C */ #include void upper(char *dest,char *src) asm mov si,src /* dest和src是地址指针 */ asm mov di,dest asm cld loop
11、:asm lodsb/* C语言定义的标号 */ asm cmp al,a asm jb copy/* 转移到C的标号 */ asm cmp al,z asm ja copy /* 不是a到z之间的字符原样复制 */,例7.21/2,asm sub al,20h /*小写字母转换成大写*/ copy:asm stosb asm and al,al /* C语言中,字符串用NULL(0)结尾 */ asm jnz loop main()/* 主程序 */ char str=This Started Out As Lowercase!; char chr100; upper(chr,str); p
12、rintf(Origin string:n%sn,str); printf(Uppercase String:n%sn,chr); ,例7.22/2,Turbo C模块连接的约定规则,命名约定 汇编语言过程应采用C语言类型 声明约定 C对调用的外部过程、变量等采用EXTERN说明 汇编语言程序的标识符用public操作符定义 寄存器使用约定 存储模式约定 采用相同的存储模式 参数传递约定:堆栈和共享变量,; 汇编语言子程序:lt703s.asm .model small,c;采用小型存储模式 .data msgdb Hello, C and Assembly ! $ .code PUBLIC
13、display displayproc;过程名加有下划线 mov ah,9;小型模式不必设置DS mov dx,offset msg ;寄存器AX和DX无须保护 int 21h ret displayendp end,例7.31/2,/* C语言程序:lt703.c */ extern void display(void); /* 说明display是外部函数 */ main() display(); ,利用汇编程序编译汇编语言程序成目标代码文件: ML /c lt703s.asm 利用C编译程序编译C程序、连接目标代码文件: TCC -ms -Iinclude -Llib lt703.c l
14、t703s.obj,例7.32/2,; 汇编语言子程序:lt704s.asm .model small,c PUBLIC min .code minproc;小型模式,为近过程 push bp mov bp,sp mov ax,bp+4;取第1个参数 cmp ax,bp+6 ;与第2个参数比较 jle minexit mov ax,bp+6 ;保存返回值 minexit: pop bp ret minendp end,例7.41/3,图示,例7.4的堆栈区,小型模式,大型模式,; 汇编语言子程序:lt704.asm .model small,c PUBLIC min .code minproc
15、 ,var1:word, var2:word mov ax,var1;取第1个参数 cmp ax,var2 ;与第2个参数比较 jle minexit mov ax,var2 ;保存返回值 minexit: pop bp ret minendp end,例7.42/3,/* C语言程序:lt704.c */ extern int min(int,int); main() printf(“%d”,min(100,200); ,小型模式编译程序和连接: TCC -ms -Iinclude -Llib lt704.c lt704s.obj 大型模式编译程序和连接: TCC -ml -Iinclude
16、 -Llib lt704.c lt704l.obj,例7.43/3,Visual C的嵌入式汇编,格式 _ _asm 指令 举例 int power2(int num,int power) _ _asm mov eax,num mov ecx,power shl eax,cl / 返回 EAX=EAX(2CL) ,模块连接的注意事项,必须遵循共同的约定规则 命名约定 声明约定 寄存器使用约定 存储模式约定 参数传递约定 采用一致的调用规范 声明共用函数和变量 正确传递入口参数和返回参数,32位汇编语言过程,用.386p等处理器伪指令说明采用的指令集 32位逻辑段环境 有些指令在32位段与16位
17、段有差别 采用平展模式(flat) 汇编时采用选项/coff,;汇编语言子程序:lt714f.asm .386p .model flat,c PUBLIC power2 .code power2proc push ebp mov ebp,esp mov eax,ebp+8;取第1个参数 mov ecx,bp+12;取第2个参数 shl eax,cl pop ebp ret;返回EAX power2endp end,例7.141/3,图示,例7.14的堆栈区,;汇编语言子程序:lt714f.asm .386p .model flat,c PUBLIC power2 .code power2PRO
18、C ,num:dword,power:dword mov eax,num;获取参数 mov ecx,power shl eax,cl;计算 ret;EAX存放返回值 power2ENDP end,例7.142/3,/ C+语言程序:lt714.cpp # include extern “c”int power2(int,int); void main(void) cout“2的6次方乘5等于:t”; coutpower2(5,6)endl; ,将汇编语言程序汇编成目标代码文件: ML /c /coff lt714f.asm 在Visual C+6.0编译环境下创建项目, 插入汇编成的目标代码文
19、,然后编译连接,例7.143/3,/ C+程序:LT715.CPP #include extern C long isum(int,int *); int imin(int,int *); void main(void) const int SIZE=10; int arraySIZE; int temp; coutarraytemp; coutendl; cout整数数据之和:tisum(SIZE,array)endl; cout其中最小值为:timin(SIZE,array)endl; ,例7.151/4,/求itmp个元素的数组iarray的最小数 int imin(int itmp,i
20、nt iarray) _asm mov ecx,itmp jecxz minexit;个数为0,返回 dec ecx mov esi,iarray mov eax,esi jecxz minexit;个数为1,返回 minlp:add esi,4 cmp eax,esi;比较两个数据的大小 jle nochange mov eax,esi;取得较小值 nochange:loop minlp minexit: ,例7.152/4,;汇编语言子程序:LT715F.ASM .386p .model flat,c .code ;32位有符号数据的求和过程 isumproc uses ecx esi,
21、count:dword,darray:PTR mov ecx,count;个数为0,和为0 xor edx,edx xor eax,eax jecxz sumexit mov esi,darray;个数为1,和为本身 mov eax,esi dec ecx jecxz sumexit,例7.153/4,sumlp:add esi,4 add eax,esi;计算低32位 adc edx,0;计算高32位 loop sumlp sumexit:ret isumendp end,例7.154/4,将汇编语言程序汇编成目标代码文件: ML /c /coff lt715f.asm 在Visual C+
22、6.0编译环境下创建项目, 插入汇编成的目标代码文件,然后编译连接,汇编程序调用C的函数,.386 .model flat, stdcall option casemap:none includelib msvcrt.lib printf PROTO C: ptr sbyte, :vararg .data szMsg byte hello world!,0ah,0 .code start: invoke printf, offset szMsg ret public start end start,一个最简单的Win32汇编语言程序 显示标准Windows消息窗口的程序 消息框显示:欢迎进入3
23、2位Windows世界! 标题:Win32示例,Win32ASM程序结构,.386 .model flat,stdcall option casemap:none include masm32includewindows.inc include masm32includekernel32.inc include masm32includeuser32.inc includelib masm32libkernel32.lib includelib masm32libuser32.lib,ltwin011/2,.data szCaptiondb Win32示例,0 szText db 欢迎进入32
24、位Windows世界!,0 .code start:invoke MessageBox,NULL, addr szText, addr szCaption,MB_OK invoke ExitProcess,NULL end start,ltwin012/2,对比C+程序,#include int WINAPI WinMain(HINSTACE hInstance, HINSTACE hPrevInstance, PSTR szCmdLine,int iCmdshow) MessageBox(NULL,TEXT(“欢迎进入32位Windows世界!”),TEXT(“Win32示例”),0); return 0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑幕墙设计师岗位个人技能考核试卷含答案
- 竹藤家具制作工复试评优考核试卷含答案
- 酶制剂发酵工安全意识强化模拟考核试卷含答案
- 滴虫性阴道炎 查房带教|病情汇报 + 床旁评估实训指南
- 高氧液治疗家兔重症急性胰腺炎的作用机制与疗效探究
- 高校辅导员职业倦怠的多维度剖析与突围路径
- 高校网上预约报销系统的设计与实现:基于数字化转型的深度剖析
- 高校新生满意度的多维度解析与提升策略研究
- 高校思想政治理论课学生课堂学习行为的多维度探究与提升策略
- 高校后勤维修管理的困境洞察与革新路径
- (2025年标准)电力产权分界协议协议书
- 吸氧的护理教学课件
- 儿童糖尿病酮症酸中毒诊疗指南(2024年)解读课件
- agv小车管理制度
- 2025年江苏专转本英语真题及答案
- 舆情管理培训课件
- 【MOOC】食品化学-中国海洋大学 中国大学慕课MOOC答案
- 人教版六年级上册解方程练习300道及答案
- 3-4、HJ 75-2017 固定污染源烟气(SO2、NOX、颗粒物)排放连续监测技术规范【现行】
- GB/T 17630-2024土工合成材料动态穿孔试验落锥法
- 变压器油箱制造工艺
评论
0/150
提交评论