安徽理工大学计算机汇编教程-汇编语言与CC的混合编程.ppt

上传人:w****2 文档编号:6296884 上传时间:2020-02-22 格式:PPT 页数:22 大小:337.82KB
返回 下载 相关 举报
安徽理工大学计算机汇编教程-汇编语言与CC的混合编程.ppt_第1页
第1页 / 共22页
安徽理工大学计算机汇编教程-汇编语言与CC的混合编程.ppt_第2页
第2页 / 共22页
安徽理工大学计算机汇编教程-汇编语言与CC的混合编程.ppt_第3页
第3页 / 共22页
点击查看更多>>
资源描述
2020 2 22 第13章汇编语言与C C 的混合编程 1 8086 8088和ARM核汇编语言程序设计 第13章汇编语言与C C 的混合编程 2020 2 22 第13章汇编语言与C C 的混合编程 2 13 1C C 语言参数调用协议 13 2汇编语言与C C 语言的连接 第13章汇编语言与C C 的混合编程 2020 2 22 第13章汇编语言与C C 的混合编程 3 调用协议是指在进行了程序调用时 主程序向子程序传递参数以及从子程序获得返回值的方式 通常使用系统堆栈向子程序传递入口参数 而使用CPU内部寄存器来保存子程序的返回值 采用C C 语言调用协议调用一个子程序时 是按照调用参数表自右向左的顺序将子程序入口参数压入堆栈的 13 1 1入口参数传递规则 13 1C C 语言参数调用协议 2020 2 22 第13章汇编语言与C C 的混合编程 4 例如在C语言源程序中有子程序max a b c 则是参数c最先入栈 然后是参数b入栈 最后是参数a入栈 且位于栈顶 堆栈的地址变化是向下增长的 最后一个进入堆栈的参数总在内存的低端 它的地址 BP 偏移量 其中偏移量在小 紧凑模式下是4 在中 大 巨模式下是6 C传递到汇编的参数若是基本数据类型之一 则该参数实际值被拷贝到堆栈中 执行汇编语言子程序时 将从堆栈中取出其参数的值 对于结构类型变量 如数组等 则将指向该结构变量的地址指针传送到堆栈中 表13 1指出了各基本数据类型在堆栈中所占的字节数 13 1 1入口参数传递规则 13 1C C 语言参数调用协议 2020 2 22 第13章汇编语言与C C 的混合编程 5 13 1 1入口参数传递规则 13 1C C 语言参数调用协议 表13 1C语言中各种类型变量在栈中所占的字节数 2020 2 22 第13章汇编语言与C C 的混合编程 6 13 1 2返回参数传递规则 13 1C C 语言参数调用协议 经汇编程序处理的结果通过AX和DX寄存器返回给C主程序 一般情况下只需通过AX寄存器即可将汇编程序的返回值传递给C程序 对于长整型数还需使用DX寄存器 至于结构变量 浮点数 双精度数 则存放在一块静态存储区内 用AX和DX返回指向它们的指针 C程序中的接受变量应与返回值类型一致 返回值与寄存器的对应关系见表13 2 2020 2 22 第13章汇编语言与C C 的混合编程 7 13 1 2返回参数传递规则 13 1C C 语言参数调用协议 表13 2C程序返回值与汇编语言寄存器对应关系 2020 2 22 第13章汇编语言与C C 的混合编程 8 13 1C C 语言参数调用协议 第13章汇编语言与C C 的混合编程 13 2汇编语言与C C 语言的连接 2020 2 22 第13章汇编语言与C C 的混合编程 9 13 2 1模块连接法 13 2汇编语言与C C 语言的连接 所谓模块连接法是指将汇编语言源程序和高级语言源程序分别编译成目标文件 再将目标文件进行连接 形成可执行文件的编程方法 要使汇编语言模块和C语言模块正确地连接到一起 必须做到两点 首先是汇编模块必须采用和C模块一致的存储模式 其次汇编模块还必须遵守和C语言兼容的命名约定 命名约定包括段组命名约定和函数变量量命名约定 2020 2 22 第13章汇编语言与C C 的混合编程 10 13 2 1模块连接法 13 2汇编语言与C C 语言的连接 1 存储模式 C语言的存储模式和汇编语言相同 共有六种不同的存储模式 微模式 TINY 小模式 SMALL 中模式 MEDIUM 紧凑模式 COMPACT 大模式 LARGE 和超大模式 HUGE 在混合编程时应该保持汇编语言和C的存储模式一致 这里尤其要注意的是 在小模式下所有的指针都是near型的近指针 而数据 堆栈和代码可以各占一个段空间 这样运算速度快而且可用空间也大 程序运行效率最高 所以 应该尽量采用小模式进行混合编程 2020 2 22 第13章汇编语言与C C 的混合编程 11 2 标识符命名约定 13 2 1模块连接法 13 2汇编语言与C C 语言的连接 在一般情况下 由C语言编译器所编译出的源程序目标码中 缺省时自动在所有标识符前面加一个下划线 这一点可以在所有的C语言程序编译后所产生的汇编码中清楚地看到 因此 在编写能被C语言程序调用的汇编语言程序时 必须将与C语言程序调用相关的标识符前面也加上下划线 才能取得和C语言程序的一致性 另外 在使用中还应注意以下问题 汇编语言子程序中供C语言程序使用的变量 除了在标识符前加下划线外 还必须用public说明为 public 变量名 汇编语言子程序变量的定义必须与C语言程序中变量的说明一致 在供C语言程序调用的汇编子程序中 必须用public伪操作指明该子程序是可以供外部模块调用的 说明为public 过程名 为了在C语言程序中引用汇编语言子程序和变量 在C程序中应使用extern语句声明 2020 2 22 第13章汇编语言与C C 的混合编程 12 3 C程序和汇编程序连接 13 2 1模块连接法 13 2汇编语言与C C 语言的连接 根据上面的有关约定 下面给出C程序调用汇编语言子程序的主要步骤 汇编语言子程序的编写和处理 1 使用和C相同的存储模式定义各个段空间 没有用到的段可以不定义 2 在汇编语言源程序中用PUBLIC伪指令声明C需要引用的子程序和变量 3 按照C语言调用协议从堆栈中取得入口参数 4 对参数进行处理 实现相应的功能 5 将返回值送入AX DX 或者DX AX中返回 6 将汇编源程序编译成目标文件 obj C程序的编写和处理 1 在TurboC C BorlandC 集成开发环境中编写C主程序 并在主源程序中用extern声明汇编语言子程序和变量 2 建立项目文件 PRJ 使其包含C主程序和汇编子程序目标文件名 obj 3 将集成开发环境的Project projectname设为C主程序名 prj 并且将编译模式子菜单设为要求的编译模式 4 用Compiler MakeEXEfile子菜单或直接按F9 生成可执行文件 EXE 2020 2 22 第13章汇编语言与C C 的混合编程 13 13 2 1模块连接法 13 2汇编语言与C C 语言的连接 例13 1汇编语言程序实现将C语言程序中的整型变量num加1 并返回给C程序 程序如下 C程序 intnum 0 externvoidincnum void main inti for i 0 i 10 i incnum printf d num 汇编程序modelsmallEXTERN num wordPUBLIC incnum code incnumprocinc numret incnumendpend 程序运行结果为 12345678910 2020 2 22 第13章汇编语言与C C 的混合编程 14 例13 3C语言程序和采用完整段定义形式实现的汇编程序的连接 下面的程序实现求2个整数中的最大数并输出 13 2 1模块连接法 13 2汇编语言与C C 语言的连接 C程序 externintmax int int main inta 2 b 6 intmaxunm maxnum max a b printf twonumbersare dand d a b printf n printf themaxnumberis d maxunm 汇编程序 TEXTSEGMENTBYTEPUBLIC CODE ASSUMECS TEXTPUBLIC max maxPROCNEARPUSHBPMOVBP SPMOVAX BP 4 AX 函数的第一个参数CMPAX BP 6 第一个参数和第二个参数比较JGEOKMOVAX BP 6 如果第一个参数比第二个参数小OK 将大数送AXPOPBPRET maxENDP TEXTENDSEND 2020 2 22 第13章汇编语言与C C 的混合编程 15 13 2 2嵌入式汇编法 13 2汇编语言与C C 语言的连接 所谓嵌入式汇编是指将汇编语言代码直接放入C语言程序中的一种混合编程方法 嵌入式汇编提供了一种简单而又明快的方法 汇编语言代码的高速性和深层控制能力可以大大改善程序的性能 同时也避免了C语言与汇编语言的接口所固有的复杂性 当然这也多少比单用汇编语言编写的模块多一些开销 但这比起由嵌入式汇编所带来的效益是微不足道的 本节以TurboC来说明如何在C语言程序中使用嵌入式汇编 2020 2 22 第13章汇编语言与C C 的混合编程 16 TurboC的嵌入式汇编可以满足用户的各种愿望 可以将汇编码直接放入C语言程序的任何位置 嵌入的汇编码可以全面地访问C语言程序中的常量 变量 甚至函数 嵌入式汇编可以极大地改善程序的性能 与用严格的汇编语言编写出的程序几乎具有同样强大的功能 在TurboC的高性能函数库中有相当一部分的程序代码是使用嵌入式汇编完成的 13 2 2嵌入式汇编法 13 2汇编语言与C C 语言的连接 2020 2 22 第13章汇编语言与C C 的混合编程 17 嵌入式汇编的语句格式 13 2 2嵌入式汇编法 13 2汇编语言与C C 语言的连接 嵌入式汇编语句的一般格式是 asm 标号 或者 新语句行 下面对汇编语句格式进行以下说明 1 asm项是每个嵌入式汇编语句开头必须的关键字 2 标号项是一个有效的汇编标号 与普通的汇编语言格式一样 标号是可选项 3 指令 伪指令项是任何一条有效的8086指令或者汇编语言伪指令 4 操作数项是CPU内部寄存器或者C源程序中定义的变量 常量或标号 5 或者 新语句行 项表示嵌入式汇编语句的结束 可选项 嵌入式汇编语句结束的方法有两种 一是象普通的C语句一样以分号 结束 也可以采用汇编语言指令一样直接以换行符结束 在同一水平行内可有多条嵌入式汇编语句汇编语句 这时语句间必须以分号 分隔 但是一条嵌入式汇编语句不能被分割为多行文本 还应注意不能再用分号 来表示汇编注释的开始 注释应采用C语言的标准注释 来表示 2020 2 22 第13章汇编语言与C C 的混合编程 18 2 嵌入式汇编的编译 13 2 2嵌入式汇编法 13 2汇编语言与C C 语言的连接 使用嵌入式汇编的C程序 编译时需要使用 B 大写 选择项 在TurboC中 进行编译命令的格式为TCC B 若不使用一B选择项 编译器一遇到嵌入式汇编代码 就给出警告信息 并以 B选择项重新进行编译 在C程序中加上即 pragmainline语句 作用与 B选择项等价 编译时嵌入式汇编语句中操作码和操作数将直接复制到由C源程序产生的汇编文件 其中涉及的C符号用适当的等价汇编符号代替 另外 必须有TurboAssember TASM 程序 C编译器首先产生汇编源文件 然后调用TASM产生目标文件 obj 进一步生成 EXE文件 2020 2 22 第13章汇编语言与C C 的混合编程 19 13 2 2嵌入式汇编法 13 2汇编语言与C C 语言的连接 3 嵌入式汇编的举例 例13 5实现下列函数 0 x 01x 0 y 函数表达式中x y均为整数 用嵌入式汇编实现 2020 2 22 第13章汇编语言与C C 的混合编程 20 13 2 2嵌入式汇编法 13 2汇编语言与C C 语言的连接 程序如下 pragmainlinemain intx y scanf d 2020 2 22 第13章汇编语言与C C 的混合编程 21 例13 6用嵌入式汇编实现求两个数的最大值的函数 程序如下 intmax inta intb asmmovax aasmcmpax basmjgeexitasmmovax bexit return AX 13 2 2嵌入式汇编法 13 2汇编语言与C C 语言的连接 2020 2 22 第13章汇编语言与C C 的混合编程 22 第6章作业 6 16 2
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!