第6章补充1-C语言和汇编语言的混合编程_第1页
第6章补充1-C语言和汇编语言的混合编程_第2页
第6章补充1-C语言和汇编语言的混合编程_第3页
第6章补充1-C语言和汇编语言的混合编程_第4页
第6章补充1-C语言和汇编语言的混合编程_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、 汇编语言编程汇编语言编程l优点:可以充分地控制处理器的功能,为人工映射算法构成最有效的程序l缺点:编码效率低、可维护性和移植能力差C/C+语言编程语言编程l优点:编码效率高、可维护性和移植性好l缺点:速度慢、存储器利用效率低混合编程混合编程 C语言和汇编语言的混合编程语言和汇编语言的混合编程以TMS320C2x/C2xx/C5x的C编译器为例 1 C语言的存储器模型 2 C语言的寄存器规则 3 C语言的函数调用规则 4 C与汇编语言的接口 C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的存储器模型语言的存储器模型 1 C语言的存储器模型 C编译器产生的段编译器产生的段段名称 段内容

2、存储器类型页已初始化段.text可执行代码和浮点常数ROM或RAM0.cinit已初始化的全局变量和静态变量的列表ROM或RAM0.switch用于多开关语句的跳转列表ROM或RAM0.const已初始化的字符串、全局常量和静态常量ROM或RAM1未初始化段.bss全局和静态变量RAM1.stack软件堆栈RAM1.system动态存储空间RAM1C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的存储器模型语言的存储器模型C系统堆栈(软件堆栈)系统堆栈(软件堆栈)l堆栈的作用分配局部变量向函数传递参数保存函数的返回地址保存处理器的状态保存寄存器保存暂时结果l堆栈的大小默认大小为 1k字

3、,链接时可用-stack size改变大小编译器、链接器没有提供检查堆栈溢出的方法,堆栈溢出会破环运行环境,导致程序失败,因此,要确保有足够大的空间用于堆栈的扩展l堆栈的管理堆栈从低地址向高地址增长AR1:堆栈指针(SP),SP指针指向堆栈的下一个可访问单元AR0:结构(frame)指针(FP),指向当前结构的开始处,函数调用时,函数的局部变量会在栈顶创建一个新的frame C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的存储器模型语言的存储器模型动态存储空间(动态存储空间(.system段)段)l用于运行时为变量动态分配存储器,malloc、calloc、realloc、freel

4、总是采用间接寻址来访问,即用指针来访问l默认大小为1k字l链接时可用-heap size改变大小C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的寄存器规则语言的寄存器规则 2 C语言的寄存器规则寄存器使用、保存规定寄存器使用、保存规定l编译器如何使用寄存器l函数调用时如何保护寄存器值寄存器用处被调函数保护AR0结构指针YesAR1堆栈指针YesAR2局部变量指针NoAR2AR5表达式分析NoAR6AR7寄存器变量YesACC累加器表达式分析/返回值NoP表达式分析NoT表达式分析NoC语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的寄存器规则语言的寄存器规则状态位域状态位域

5、l保留值是在进入一个函数或从一个函数返回时,编译器期望的该位域的值l短横线表示编译器不期望一个特定的值l被修改栏表明编译器代码产生器是否曾修改该位域 域名称保留值被修改ARP辅助寄存器指针1YesC进位位YesDP数据页YesOV溢出位YesOVM溢出模式0NoPM乘积移位模式0NoSXM符号扩展模式YesTC测试位YesC语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的寄存器规则语言的寄存器规则堆栈指针、结构指针和局部变量指针堆栈指针、结构指针和局部变量指针堆栈指针SPAR1堆栈指针SP,指向堆栈的下一个可访问单元堆栈从低地址向高地址增长结构(frame)指针FP当一个函数要求局部存

6、储时(如局部变量、暂存单元),它将在堆栈中建立自己的操作空间(局部结构),该局部结构在函数进入时在堆栈中建立分配,在函数返回时释放分配AR0结构指针FP,指向当前结构的开始处FP指向的局部结构的第一个单元被用作暂时存储单元,以允许寄存器之间的数据传输,且对于C函数的重入是必须的局部变量指针LVPAR2局部变量指针LVP所有存储在局部结构中的对象,包括参数,都通过LVP进行间接访问 C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的寄存器规则语言的寄存器规则寄存器变量寄存器变量l寄存器变量是局部变量,位于寄存器中(不是存储器中)的编译器的临时变量l编译器使用这些寄存器变量的方式取决于是否

7、使用了优化器表达式分析寄存器表达式分析寄存器l表达式分析寄存器用于计算表达式的值并保存临时的结果l表达式分析寄存器的内容在被调函数中不被保护l任何用于临时存储的表达式分析寄存器在函数调用前被保存在局部结构中返回值返回值l函数返回值放在累加器中 C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的函数调用规则语言的函数调用规则 3 C语言的函数调用规则如何产生函数调用如何产生函数调用一个函数(父函数)在调用其它函数(子函数)执行以下任务注意:注意:ARP必须设为必须设为11)父函数将参数以颠倒的顺序压入堆栈,最右边声明的参数第一个压入堆栈,最左边的参数最后一个压入堆栈,即最左边的参数在栈顶

8、2)父函数调用子函数3)父函数假定从子函数返回时,ARP将被置为14)完成调用后,父函数以SBRK n (n是压入堆栈的参数个数)将参数弹出堆栈C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的函数调用规则语言的函数调用规则被调函数如何相应响应被调函数如何相应响应 被调函数(子函数)需要完成以下任务在函数的入口,在函数的入口,ARP假定已经设置为假定已经设置为11)将返回地址从硬件堆栈中弹出,并压入软件堆栈中2)将原FP压入软件堆栈3)分配局部结构4)如果子函数中修改了AR6和/或AR7,则将它们压入堆栈,其它的任何寄存器可能被无保存地修改5)执行该函数的代码6)将返回值放入累加器7)

9、设置ARP为AR18)如果AR6和/或AR7被保存,则恢复它们9)释放局部结构分配10)恢复原FP11)从软件堆栈中复制返回地址,并压入硬件堆栈12)返回父函数C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的函数调用规则语言的函数调用规则l例例C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言的函数调用规则语言的函数调用规则被调函数的特殊情况被调函数的特殊情况没有将返回地址移到软件堆栈中如果被调函数(子函数)没有调用其它函数,或只调用了一个运行支持函数,且编译器知道该函数不会超过8级深度的调用,即不会发生硬件堆栈的溢出,则就不必将返回地址从硬件堆栈中弹出,又压入软件堆栈中没有分

10、配局部结构如果没有局部变量,也没有使用由AR0(FP)指向的暂时存储单元,则不必分配局部结构参数和局部变量的访问参数和局部变量的访问l参数和局部变量通过LVP(AR2)来访问l参数总是相对于FP的负偏移量l局部变量总是相对于FP的正偏移量C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言与汇编语言的接口语言与汇编语言的接口 4 C语言与汇编语言的接口 独立的独立的C和汇编模块接口和汇编模块接口在编写汇编语言时必须遵循有关的寄存器规则和调用规则,否则可能会破坏C的运行环境在编写独立的汇编程序时,必须注意以下几点:无论是C函数还是汇编函数,都必须遵循寄存器使用规则必须保护函数要用到的几个专用

11、寄存器,专用寄存器包括:AR0(FP)、AR1(SP)、AR6和AR7;其中,如果SP正常使用的话,则不必明确加以保护,即只要汇编函数在返回时弹出压入的对象,实际上就已经保护了SP其它寄存器可以自由使用 C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言与汇编语言的接口语言与汇编语言的接口如果改变了状态位域的假定值,则函数返回时必须被恢复,尤其是ARP,必须为1中断程序必须保护所有用到的寄存器汇编语言调用C函数时,将参数以逆序压入软件堆栈,函数调用后弹出堆栈调用C函数时,C函数只保护几个专用寄存器,C函数可能改变其它任何寄存器的内容长整型和浮点数在存储器中存放的顺序是低位字在低地址,高位

12、字在高地址如果函数有返回值,则返回值存放在累加器ACC中汇编程序不能改变由C产生的.cinit段的内容,否则可能会引起不可预测的后果编译器在所有的C标识符(函数名、变量名等)前加下划线“_”;因此,在编写汇编程序时,必须在C程序要访问的对象前加下划线“_”;例如,在C程序中定义了变量x,在汇编语言中使用时为_x;如果仅在汇编语言中使用的标识符,则不必加下划线任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用.global汇编伪指令声明;同样,在C程序中定义的对象或函数,如果需要在汇编程序中访问或调用,在汇编程序中也必须用.global汇编伪指令声明 C语言和汇编语言的混合

13、编程语言和汇编语言的混合编程C语言与汇编语言的接口语言与汇编语言的接口例:C程序main函数调用一个汇编函数asmfunc,asmfunc函数只有一个参数,该参数与C中的全局变量gvar相加,返回该结果例中可以不必将返回地址从硬件堆栈移到软件堆栈中,因为asmfunc函数没有进行别的调用 C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言与汇编语言的接口语言与汇编语言的接口在在C程序中直接嵌入汇编语句程序中直接嵌入汇编语句在C程序中使用asm语句嵌入单行的汇编语句优点:简单,在C程序中可以实现C语言无法实现的一些硬件控制功能,如修改中断控制寄存器、中断的是能或无效、读取状态寄存器和中断标

14、志寄存器等缺点:容易破坏C环境,因为C编译器不对嵌入的汇编语句进行检测和分析 注意在C代码中嵌入跳转语句或标识符可能会产生无法预知的结果不要改变C变量的值,但可以安全地读任何变量的当前值不要嵌入汇编伪指令,这会破坏汇编语言环境C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言与汇编语言的接口语言与汇编语言的接口在在C代码中访问汇编语言变量代码中访问汇编语言变量l在汇编语言中定义变量,变量名前加下划线“_”l使用.global声明为全局变量l在C程序中声明该变量为外部的,并正常地对它访问 C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言与汇编语言的接口语言与汇编语言的接口2C语言和汇编语言的混合编程语言和汇编语言的混合编程C语言与汇编语言的接口语言与汇编语言的接口在汇编语言中

温馨提示

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

评论

0/150

提交评论