汇编与C_C的混合编程_第1页
汇编与C_C的混合编程_第2页
汇编与C_C的混合编程_第3页
汇编与C_C的混合编程_第4页
汇编与C_C的混合编程_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、汇编与汇编与C/C+的混合编程的混合编程要调用带参数过程定义的过程,不应采用要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐指令,因为比较烦琐应该采用过程调用伪指令应该采用过程调用伪指令INVOKE使用使用INVOKE伪指令的前提是需要用伪指令的前提是需要用PROTO伪指令对过程进行声明伪指令对过程进行声明过程声明和过程调用伪指令过程声明和过程调用伪指令过程名过程名 PROC调用距离调用距离 语言类型语言类型 作用范围作用范围 USES 寄存器列表寄存器列表, 参数参数:类型类型LOCAL 参数表参数表;汇编语言语句汇编语言语句过程名过程名 ENDP过程声明伪指令:过程声明伪指令

2、:用于事先声明过程的结构用于事先声明过程的结构过程名过程名PROTO 调用距离调用距离 语言类型语言类型, 参数参数:类型类型过程调用伪指令过程调用伪指令INVOKE 过程名过程名,参数参数,.如何调如何调用用调用距离调用距离 调用距离调用距离可以是可以是NEAR16、NEAR32、FAR,表示该过程是近,表示该过程是近或远调用。简化段格式中,缺省值或远调用。简化段格式中,缺省值由由.model语句选择的存储模式决定。语句选择的存储模式决定。 语言类型语言类型 语言类型语言类型可以是任何有效的语言类型,可以是任何有效的语言类型,确定该过程采用的命名约定和调用约定;语确定该过程采用的命名约定和调

3、用约定;语言类型还可以由言类型还可以由.model伪指令指定伪指令指定 语言类型语言类型CSYSCALLSTDCALLPASCALBASICFORTRAN命名约定命名约定名字前加名字前加下划线下划线 名字前加名字前加下划线下划线名字变名字变大写大写名字大名字大写写名字大名字大写写参数传递顺序参数传递顺序从右到左从右到左从右到从右到左左(注)(注)从左到从左到右右从左到从左到右右从左到从左到右右平衡堆栈的程平衡堆栈的程序序调用程序调用程序被调用被调用程序程序被调用程被调用程序序被调用被调用程序程序被调用被调用程序程序被调用被调用程序程序保存保存BP 是是是是是是允许允许VARARG参数参数是是是

4、是是是 作用范围作用范围 作用范围作用范围可以是可以是PUBLIC、PRIVATE、EXPORT,表示该过程是否对其他模块可见。,表示该过程是否对其他模块可见。缺省是缺省是PUBLIC,表示其他模块可见;,表示其他模块可见;PRIVATE表示对外不可见;表示对外不可见;EXPORT隐含有隐含有PUBLIC和和FAR,表示该过程应该放置在导,表示该过程应该放置在导出表(出表(export entry table)。)。起始参数起始参数 起始参数起始参数采用这个格式的采用这个格式的PROC伪伪指令,汇编系统将自动创建过程的起始指令,汇编系统将自动创建过程的起始代码(代码(Prologue code

5、)和收尾代码)和收尾代码(Epilogue code),用于传递堆栈参数),用于传递堆栈参数以及清除堆栈等。起始参数表示传送给以及清除堆栈等。起始参数表示传送给起始代码的参数;它必须使用尖括号起始代码的参数;它必须使用尖括号“”括起来,多个参数用逗号分隔。括起来,多个参数用逗号分隔。 寄存器列表寄存器列表 寄存器列表寄存器列表指通用寄存器名,指通用寄存器名,用空格分隔多个寄存器。只要利用用空格分隔多个寄存器。只要利用“USES 寄存器列表寄存器列表”罗列该过程中罗列该过程中需要保存与恢复的寄存器,汇编系需要保存与恢复的寄存器,汇编系统将自动在起始代码产生相应的入统将自动在起始代码产生相应的入栈

6、指令,并对应在收尾代码产生出栈指令,并对应在收尾代码产生出栈指令。栈指令。 参数参数 参数参数类型类型表示过程使用的形参及类型。表示过程使用的形参及类型。在在16位段中,缺省的类型是字位段中,缺省的类型是字WORD,在,在32位位段中缺省的类型是双字段中缺省的类型是双字DWORD。 参数类型可以是任何参数类型可以是任何MASM有效的类型或有效的类型或PTR(表示地址指针);在(表示地址指针);在C、SYSCALL、STDCALL语言类型中。语言类型中。 PROC伪指令中使用参数,必须定义语言类型。伪指令中使用参数,必须定义语言类型。局部变量局部变量 如果过程使用局部变量,紧接着过程定义伪指如果

7、过程使用局部变量,紧接着过程定义伪指令令PROC,可以采用一条或多条,可以采用一条或多条LOCAL伪指伪指令说明。令说明。 其中,可选的其中,可选的“个数个数”表示同样类型数据的表示同样类型数据的个数,类似数组元素的个数。在个数,类似数组元素的个数。在16位段中,缺位段中,缺省的类型是字省的类型是字WORD,在,在32位段中缺省的类位段中缺省的类型是双字型是双字DWORD。使用。使用LOCAL伪指令说明伪指令说明局部变量后,汇编系统将自动利用堆栈存放该局部变量后,汇编系统将自动利用堆栈存放该变量变量. .例例fig6-20new.asm 此例该自此例该自fig6-20.asm,请注意比较。请注

8、意比较。.386.MODEL FLAT, stdcall ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORDMove PROTO NEAR32 C, :WORD, :BYTE, :BYTE, :BYTE include io.h ; header file for input/output cr equ 0dh ; carriage return characterLf equ 0ah ; line feed .STACK 4096 ; reserve 4096-byte stack .DATA ; reserve storage for da

9、taprompt BYTE cr,Lf,How many disks? ,0number BYTE 16 DUP (?)count word ?message BYTE cr,Lf,Move disk from spindle source BYTE ? BYTE to spindle dest BYTE ? BYTE .,0.CODEMove PROC NEAR32 c uses eax ebx, countp:word, Sr:byte , Dst:byte, Spa: byte cmp countp , 1 ; NbrDisks = 1? jne elseMore ; skip if m

10、ore than 1 mov bx,word ptr Sr ; Source mov source,bl ; copy character to output mov bx,word ptr Dst ; destination mov dest,bl ; copy character to output output message ; print line jmp endIfOne ; returnelseMore: dec countp INVOKE Move, countp, Sr, Spa, Dst INVOKE Move, 1, Sr, Dst, Spa INVOKE Move, c

11、ountp, Spa, Dst, SrendIfOne: ret ; returnMove ENDPstart: output prompt ; ask for number of disks 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 publicEND ; end of source

12、 code列表文件 什么是混合编程什么是混合编程 多种程序设计语言间,通过相互调用、多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息而参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程形成程序的过程就是混合编程 程序的大部分采用高级语言编写,以提程序的大部分采用高级语言编写,以提高程序的开发效率;在某些部分,利用高程序的开发效率;在某些部分,利用汇编语言编写,以提高程序的运行效率汇编语言编写,以提高程序的运行效率混合编程方法混合编程方法 嵌入式汇编嵌入式汇编 在在C/C+语言中直接使用汇编语言语句,语言中直接使用汇编语言语句, 简洁直观、功能较弱简洁直观、功能较弱

13、模块连接模块连接 两种语言分别编写独立的程序模块,分别两种语言分别编写独立的程序模块,分别产生目标代码产生目标代码OBJ文件,然后进行连接,文件,然后进行连接,形成一个完整的程序形成一个完整的程序 使用灵活、功能强,要解决参数传递问题使用灵活、功能强,要解决参数传递问题混合编程的关键问题混合编程的关键问题 建立不同语言之间的接口建立不同语言之间的接口 在不同格式的两种语言间提供有效在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言调的通讯方式,作出符合两种语言调用约定的某种形式说明,实现两种用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量语言间的程序模块互相调用、变量的相互

14、传送以及参数和返回值的正的相互传送以及参数和返回值的正确使用确使用Turbo C嵌入式汇编方式嵌入式汇编方式 格式格式asm 操作码操作码 操作数操作数 举例举例asm mov ax,ds;asm pop ax; asm pop ds; asm ret;asm push ds若干注意事项若干注意事项 操作码支持操作码支持8086/8087指令或若干伪指指令或若干伪指令:令:db/dw/dd和和extern 操作数是操作码可接受的数据:立即数、操作数是操作码可接受的数据:立即数、寄存器名,还可以是寄存器名,还可以是C语言程序中的常语言程序中的常量、变量和标号等量、变量和标号等 内嵌的汇编语句可以

15、用分号内嵌的汇编语句可以用分号“;”结束,结束,也可以用换行符结束也可以用换行符结束 使用使用C的注释,如的注释,如 / * * / 正确运用通用寄存器、标号等正确运用通用寄存器、标号等/ * LT702.C */#include void upper(char *dest,char *src)asm mov si,src/* dest和和src是地址指针是地址指针 */asm mov di,destasm cldloop: asm lodsb/* C语言定义的标号语言定义的标号 */asm cmp al,aasm jb copy/* 转移到转移到C的标号的标号 */asm cmp al,za

16、sm ja copy/* 不是不是a到到z之间的字符原样复制之间的字符原样复制 */例7.21/2asm sub al,20h /*小写字母转换成大写小写字母转换成大写*/copy: asm stosbasm and al,al/* C语言中,字符串用语言中,字符串用NULL(0)结尾)结尾 */asm jnz loopmain()/* 主程序主程序 */char str=This Started Out As Lowercase!;char chr100;upper(chr,str);printf(Origin string:n%sn,str);printf(Uppercase String

17、:n%sn,chr);例7.22/2Turbo C模块连接的约定规则模块连接的约定规则 命名约定命名约定 汇编语言过程应采用汇编语言过程应采用C语言类型语言类型 声明约定声明约定 C对调用的外部过程、变量等采用对调用的外部过程、变量等采用EXTERN说明说明 汇编语言程序的标识符用汇编语言程序的标识符用public操作符定义操作符定义 寄存器使用约定寄存器使用约定 存储模式约定存储模式约定 采用采用相同的存储模式相同的存储模式 参数传递约定:堆栈和共享变量参数传递约定:堆栈和共享变量; 汇编语言子程序:汇编语言子程序:lt703s.asm.model small,c ;采用小型存储模式采用小型

18、存储模式.datamsgdb Hello, C and Assembly ! $.codePUBLIC displaydisplayproc;过程名加有下划线过程名加有下划线mov ah,9;小型模式不必设置小型模式不必设置DSmov dx,offset msg;寄存器寄存器AX和和DX无须保护无须保护int 21hretdisplayendpend例7.31/2/* C语言程序:语言程序:lt703.c */extern void display(void);/* 说明说明display是外部函数是外部函数 */main() display();利用汇编程序编译汇编语言程序成目标代码文件:利

19、用汇编程序编译汇编语言程序成目标代码文件:ML /c lt703s.asm利用利用C编译程序编译编译程序编译C程序、连接目标代码文件:程序、连接目标代码文件:TCC -ms -Iinclude -Llib lt703.c lt703s.obj例7.32/2; 汇编语言子程序:汇编语言子程序:lt704s.asm.model small,cPUBLIC min.codeminproc;小型模式,为近过程小型模式,为近过程push bpmov bp,spmov ax,bp+4;取第取第1个参数个参数cmp ax,bp+6 ;与第与第2个参数比较个参数比较jle minexitmov ax,bp+6

20、 ;保存返回值保存返回值minexit: pop bpretminendpend例7.41/3图示large688L例例7.4的堆栈区的堆栈区堆栈段堆栈段20061004偏移地址偏移地址2BP小型模式小型模式堆栈段堆栈段20081006段地址段地址4偏移地址偏移地址2BPBPBPSPSP大型模式大型模式; 汇编语言子程序汇编语言子程序:lt704.asm.model small,cPUBLIC min.codeminproc ,var1:word, var2:wordmov ax,var1;取第取第1个参数个参数cmp ax,var2 ;与第与第2个参数比较个参数比较jle minexitmo

21、v ax,var2 ;保存返回值保存返回值minexit: pop bpretminendpend例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 -Llib lt704.c lt704l.obj例7.43/3Visual C的嵌入式汇编的嵌入式汇编 格式格式

22、_ _asm 指令指令 举例举例int power2(int num,int power)_ _asmmov eax,nummov ecx,powershl eax,cl/ 返回返回 EAX=EAX(2CL)模块连接的注意事项模块连接的注意事项 必须遵循共同的约定规则必须遵循共同的约定规则 命名约定命名约定 声明约定声明约定 寄存器使用约定寄存器使用约定 存储模式约定存储模式约定 参数传递约定参数传递约定 采用一致的调用规范采用一致的调用规范 声明共用函数和变量声明共用函数和变量 正确传递入口参数和返回参数正确传递入口参数和返回参数32位汇编语言过程位汇编语言过程 用用.386p等处理器伪指令

23、说明采用的指等处理器伪指令说明采用的指令集令集 32位逻辑段环境位逻辑段环境 有些指令在有些指令在32位段与位段与16位段有差别位段有差别 采用平展模式(采用平展模式(flat) 汇编时采用选项汇编时采用选项/coff;汇编语言子程序:汇编语言子程序:lt714f.asm.386p.model flat,cPUBLIC power2.codepower2 procpush ebpmov ebp,espmov eax,ebp+8;取第取第1个参数个参数mov ecx,bp+12;取第取第2个参数个参数shl eax,clpop ebpret;返回返回EAXpower2 endpend例7.141

24、/3图示例例7.14的堆栈区的堆栈区堆栈段堆栈段61258EIP4EBPEBPEBPESPESP;汇编语言子程序:汇编语言子程序:lt714f.asm.386p.model flat,cPUBLIC power2.codepower2PROC ,num:dword,power:dwordmov eax,num;获取参数获取参数mov ecx,powershl eax,cl;计算计算ret;EAX存放返回值存放返回值power2ENDPend例7.142/3/ C+语言程序:语言程序:lt714.cpp# include extern “c”int power2(int,int);void ma

25、in(void) cout“2的的6次方乘次方乘5等于:等于:t”; coutpower2(5,6)endl;将汇编语言程序汇编成目标代码文件:将汇编语言程序汇编成目标代码文件:ML /c /coff lt714f.asm在在Visual C+6.0编译环境下创建项目,编译环境下创建项目,插入汇编成的目标代码文,然后编译连接插入汇编成的目标代码文,然后编译连接例7.143/3/ C+程序:程序:LT715.CPP #include extern C long isum(int,int *);int imin(int,int *);void main(void) const int SIZE=1

26、0; int arraySIZE; int temp; cout请输入请输入10个整数:个整数:endl; for(temp=0;temparraytemp; coutendl; cout整数数据之和:整数数据之和:tisum(SIZE,array)endl; cout其中最小值为:其中最小值为:timin(SIZE,array)endl;例7.151/4/求求itmp个元素的数组个元素的数组iarray的最小数的最小数int imin(int itmp,int iarray)_asm mov ecx,itmpjecxz minexit;个数为个数为0,返回,返回dec ecxmov esi,

27、iarraymov eax,esijecxz minexit;个数为个数为1,返回,返回minlp:add esi,4cmp eax,esi;比较两个数据的大小比较两个数据的大小jle nochangemov eax,esi;取得较小值取得较小值nochange: loop minlpminexit: 例7.152/4;汇编语言子程序:汇编语言子程序:LT715F.ASM.386p.model flat,c.code;32位有符号数据的求和过程位有符号数据的求和过程isum proc uses ecx esi, count:dword,darray:PTRmov ecx,count;个数为个数

28、为0,和为,和为0 xor edx,edxxor eax,eaxjecxz sumexitmov esi,darray;个数为个数为1,和为本身,和为本身mov eax,esidec ecxjecxz sumexit例7.153/4sumlp:add esi,4add eax,esi;计算低计算低32位位adc edx,0;计算高计算高32位位loop sumlpsumexit: retisumendpend例7.154/4将汇编语言程序汇编成目标代码文件:将汇编语言程序汇编成目标代码文件:ML /c /coff lt715f.asm在在Visual C+6.0编译环境下创建项目,编译环境下创

29、建项目,插入汇编成的目标代码文件,然后编译连接插入汇编成的目标代码文件,然后编译连接汇编程序调用汇编程序调用C的函数的函数.386.model flat, stdcalloption casemap:noneincludelib msvcrt.libprintf PROTO C: ptr sbyte, :vararg .dataszMsg byte hello world!,0ah,0.codestart:invoke printf, offset szMsgretpublic startend start一个最简单的一个最简单的Win32汇编语言程序汇编语言程序显示标准显示标准Windows

30、消息窗口的程序消息窗口的程序消息框显示:消息框显示:欢迎进入欢迎进入32位位Windows世界!世界!标题:标题:Win32示例示例Win32ASM程序结构程序结构.386.model flat,stdcalloption casemap:noneinclude masm32includewindows.incinclude masm32includekernel32.incinclude masm32includeuser32.incincludelib masm32libkernel32.libincludelib masm32libuser32.libltwin011/2API区别大小写

31、区别大小写包含对系统常量和包含对系统常量和API函数等的声明函数等的声明包含包含API函数的库文件函数的库文件.dataszCaption db Win32示例示例,0szText db 欢迎进入欢迎进入32位位Windows世界!世界!,0.codestart:invoke MessageBox,NULL,addr szText, addr szCaption,MB_OKinvoke ExitProcess,NULLend startltwin012/2显示消息框显示消息框API调用调用返回操作系统返回操作系统API调用调用对比对比C+程序程序#include int WINAPI WinMain(HINSTACE hInstan

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论