汇编和CC++的混合编程.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编与C/C++的混合编程 过程声明和过程调用伪指令 过程名 PROC 调用距离 语言类型 作用范围 起始参数 USES 寄存器列表, 参数:类型 LOCAL 参数表 … ;汇编语言语句 过程名 ENDP 调用距离 调用距离——可以是NEAR16、NEAR32、FAR,表示该过程是近或远调用。简化段格式中,缺省值由.model语句选择的存储模式决定。 语言类型 语言类型——可以是任何有效的语言类型,确定该过程采用的命名约定和调用约定;语言类型还可以由.model伪指令指定 作用范围 作用范围——可以是PUBLIC、PRIVATE、EXPORT,表示该过程是否对其他模块可见。缺省是PUBLIC,表示其他模块可见;PRIVATE表示对外不可见;EXPORT隐含有PUBLIC和FAR,表示该过程应该放置在导出表(export entry table)。 起始参数 起始参数——采用这个格式的PROC伪指令,汇编系统将自动创建过程的起始代码(Prologue code)和收尾代码(Epilogue code),用于传递堆栈参数以及清除堆栈等。起始参数表示传送给起始代码的参数;它必须使用尖括号“ ”括起来,多个参数用逗号分隔。 寄存器列表 寄存器列表——指通用寄存器名,用空格分隔多个寄存器。只要利用“USES 寄存器列表”罗列该过程中需要保存与恢复的寄存器,汇编系统将自动在起始代码产生相应的入栈指令,并对应在收尾代码产生出栈指令。 参数 参数∶类型——表示过程使用的形参及类型。在16位段中,缺省的类型是字WORD,在32位段中缺省的类型是双字DWORD。 参数类型可以是任何MASM有效的类型或PTR(表示地址指针);在C、SYSCALL、STDCALL语言类型中。 PROC伪指令中使用参数,必须定义语言类型。 局部变量 如果过程使用局部变量,紧接着过程定义伪指令PROC,可以采用一条或多条LOCAL伪指令说明。 其中,可选的“[个数]”表示同样类型数据的个数,类似数组元素的个数。在16位段中,缺省的类型是字WORD,在32位段中缺省的类型是双字DWORD。使用LOCAL伪指令说明局部变量后,汇编系统将自动利用堆栈存放该变量. 例fig6-20new.asm 此例该自fig6-20.asm,请注意比较。 什么是混合编程 多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程 程序的大部分采用高级语言编写,以提高程序的开发效率;在某些部分,利用汇编语言编写,以提高程序的运行效率 混合编程方法 嵌入式汇编—— 在C/C++语言中直接使用汇编语言语句, 简洁直观、功能较弱 模块连接—— 两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序 使用灵活、功能强,要解决参数传递问题 混合编程的关键问题 建立不同语言之间的接口 在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言调用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正确使用 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语言程序中的常量、变量和标号等 内嵌的汇编语句可以用分号“;”结束,也可以用换行符结束 使用C的注释,如 / * … * / 正确运用通用寄存器、标号等 例7.2-1/2 / * LT702.C */ #include stdio.h 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.2-2/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 Low

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档