汇编与C_C++的混合编程

上传人:ji****72 文档编号:51468982 上传时间:2018-08-14 格式:PPT 页数:42 大小:330.50KB
返回 下载 相关 举报
汇编与C_C++的混合编程_第1页
第1页 / 共42页
汇编与C_C++的混合编程_第2页
第2页 / 共42页
汇编与C_C++的混合编程_第3页
第3页 / 共42页
汇编与C_C++的混合编程_第4页
第4页 / 共42页
汇编与C_C++的混合编程_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《汇编与C_C++的混合编程》由会员分享,可在线阅读,更多相关《汇编与C_C++的混合编程(42页珍藏版)》请在金锄头文库上搜索。

1、汇编与C/C+的混合编程要调用带参数过程定义的过程,不应采用 CALL指令,因为比较烦琐 应该采用过程调用伪指令INVOKE 使用INVOKE伪指令的前提是需要用 PROTO伪指令对过程进行声明过程声明和过程调用伪指令过程名 PROC 调用距离 语言类型 作用范围 USES 寄存器列表, 参数:类型 LOCAL 参数表;汇编语言语句过程名 ENDP过程声明伪指令:用于事先声明过程的结构过程名PROTO 调用距离 语言类型, 参数:类型过程调用伪指令INVOKE 过程名,参数,.如何调 用调用距离调用距离可以是NEAR16、 NEAR32、FAR,表示该过程是近或 远调用。简化段格式中,缺省值由

2、 .model语句选择的存储模式决定。 语言类型语言类型可以是任何有效的语言类型, 确定该过程采用的命名约定和调用约定;语言 类型还可以由.model伪指令指定 语言类型CSYSCAL LSTDCALLPASCA LBASICFORTR AN 命名约定名字前加下 划线名字前加下 划线名字变 大写名字大 写名字大 写参数传递顺序从右到左从右到 左(注)从左到 右从左到 右从左到 右 平衡堆栈的程 序调用程序被调用 程序被调用程序被调用 程序被调用 程序被调用 程序 保存BP 是是是允许VARARG 参数是是是 作用范围 作用范围可以是PUBLIC、PRIVATE 、EXPORT,表示该过程是否对

3、其他模块可 见。缺省是PUBLIC,表示其他模块可见; PRIVATE表示对外不可见;EXPORT隐含有 PUBLIC和FAR,表示该过程应该放置在导 出表(export entry table)。起始参数起始参数采用这个格式的PROC伪 指令,汇编系统将自动创建过程的起始 代码(Prologue code)和收尾代码( Epilogue code),用于传递堆栈参数以 及清除堆栈等。起始参数表示传送给起 始代码的参数;它必须使用尖括号“”括起来,多个参数用逗号分隔。 寄存器列表寄存器列表指通用寄存器名, 用空格分隔多个寄存器。只要利用 “USES 寄存器列表”罗列该过程中 需要保存与恢复的寄

4、存器,汇编系统 将自动在起始代码产生相应的入栈指 令,并对应在收尾代码产生出栈指令 。 参数参数类型表示过程使用的形参及类型。 在16位段中,缺省的类型是字WORD,在32位 段中缺省的类型是双字DWORD。 参数类型可以是任何MASM有效的类型或PTR (表示地址指针);在C、SYSCALL、 STDCALL语言类型中。 PROC伪指令中使用参数,必须定义语言类型 。局部变量 如果过程使用局部变量,紧接着过程定义伪指 令PROC,可以采用一条或多条LOCAL伪指令 说明。 其中,可选的“个数”表示同样类型数据的 个数,类似数组元素的个数。在16位段中,缺 省的类型是字WORD,在32位段中缺

5、省的类型 是双字DWORD。使用LOCAL伪指令说明局部 变量后,汇编系统将自动利用堆栈存放该变量.例fig6-20new.asm此例该自fig6-20.asm,请注意比较。.386 .MODEL FLAT, stdcallExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD Move PROTO NEAR32 C, :WORD, :BYTE, :BYTE, :BYTEinclude io.h ; header file for input/outputcr equ 0dh ; carriage return character Lf equ 0

6、ah ; 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 from spindle source BYTE ?BYTE to spindle dest BYTE ?BYTE .,0.CODE Move PROC NEAR32 c uses eax ebx, countp:word, S

7、r:byte , Dst:byte, Spa: byte cmp countp , 1 ; NbrDisks = 1?jne elseMore ; skip if more than 1mov bx,word ptr Sr ; Sourcemov source,bl ; copy character to outputmov bx,word ptr Dst ; destinationmov dest,bl ; copy character to outputoutput message ; print linejmp endIfOne ; return elseMore: dec countp

8、INVOKE Move, countp, Sr, Spa, DstINVOKE Move, 1, Sr, Dst, SpaINVOKE Move, countp, Spa, Dst, Sr endIfOne:ret ; return Move ENDPstart: output prompt ; ask for number of disksinput number,16 ; read ASCII charactersatoi number ; convert to integerINVOKE Move, ax, A, B, CINVOKE ExitProcess, 0 ; exit with

9、 return code 0PUBLIC start ; make entry point public END ; end of source code列表文件 什么是混合编程多种程序设计语言间,通过相互调用、 参数传递、共享数据结构和数据信息而形 成程序的过程就是混合编程程序的大部分采用高级语言编写,以提 高程序的开发效率;在某些部分,利用汇 编语言编写,以提高程序的运行效率混合编程方法嵌入式汇编 在C/C+语言中直接使用汇编语言语句 , 简洁直观、功能较弱 模块连接 两种语言分别编写独立的程序模块, 分别产生目标代码OBJ文件,然后进行连 接,形成一个完整的程序 使用灵活、功能强,要解决

10、参数传递 问题混合编程的关键问题建立不同语言之间的接口 在不同格式的两种语言间提供有效 的通讯方式,作出符合两种语言调用 约定的某种形式说明,实现两种语言 间的程序模块互相调用、变量的相互 传送以及参数和返回值的正确使用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语言程序中的 常量、变量和标号等 内嵌的汇编语

11、句可以用分号“;”结束, 也可以用换行符结束 使用C的注释,如 / * * / 正确运用通用寄存器、标号等/ * LT702.C */ #include void upper(char *dest,char *src) asm mov si,src /* dest和src是地址指针 */ asm mov di,dest asm cld loop: asm lodsb/* C语言定义的标号 */ asm cmp al,a asm jb copy/* 转移到C的标号 */ asm cmp al,z asm ja copy /* 不是a到z之间的字符原样复制 */例7.21/2asm sub al,

12、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); printf(“Origin string:n%sn“,str); printf(“Uppercase String:n%sn“,chr); 例7.22/2Turbo C模块连接的约定规则命名约定 汇编语言过程应采用C语言类型 声明约定 C对调用的外

13、部过程、变量等采用 EXTERN说明 汇编语言程序的标识符用public操作符 定义 寄存器使用约定 存储模式约定 采用相同的存储模式 参数传递约定:堆栈和共享变量; 汇编语言子程序:lt703s.asm .model small,c ;采用小型存储模式 .data msg db Hello, C and Assembly ! $ .code PUBLIC display display proc;过程名加有下划线 mov ah,9;小型模式不必设置DS mov dx,offset msg ;寄存器AX和DX无须保护 int 21h ret display endp end例7.31/2/*

14、C语言程序:lt703.c */ extern void display(void); /* 说明display是外部函数 */ main() display(); 利用汇编程序编译汇编语言程序成目标代码文件: ML /c lt703s.asm利用C编译程序编译C程序、连接目标代码文件:TCC -ms -Iinclude -Llib lt703.c lt703s.obj例7.32/2; 汇编语言子程序:lt704s.asm .model small,c PUBLIC min .code min proc ;小型模式,为近过程 push bp mov bp,sp mov ax,bp+4 ;取第1

15、个参数 cmp ax,bp+6 ;与第2个参数比较 jle minexit mov ax,bp+6 ;保存返回值 minexit: pop bp ret min endp end例7.41/3图示large6 88L例7.4的堆栈区堆栈段2006 1004偏移地址2BP小型模式堆栈段2008 1006段地址4偏移地址2BPBPSP大型模式; 汇编语言子程序:lt704.asm .model small,c PUBLIC min .code min proc ,var1:word, var2:word mov ax,var1;取第1个参数 cmp ax,var2 ;与第2个参数比较 jle minexit mov ax,var2 ;保存返回值 minexit: pop bp ret min endp end例7.42/3

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号