DSP系统实验07-C语言和汇编语言的混合编程(精)_第1页
DSP系统实验07-C语言和汇编语言的混合编程(精)_第2页
免费预览已结束,剩余10页可下载查看

下载本文档

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

文档简介

1、C 语言和汇编语言的 H混合编程汇编语言编程优点:可以充分地控制处理器的功能,为人工映射算法 构成最有效的程序缺点:编码效率低、可维护性和移植能力差 C/C+语言编程优点:编码效率高、可维护性和移植性好缺点:速度慢、存储器利用效率低混合编程 realloc、free总是采用间接寻址来访问,即用指针来访问默认大小为1k字链接时可用-heap size改变大小c语言和汇编语言的混合编程今c语言的寄存s规则 2C 语言的寄存器规则寄存器使用、保存规定编译器如何使用寄存器函数调用时如何保护寄存器值寄存器用处被调函数保护AR0结构指针YesAR1堆栈指针YesAR2局部变量指针NoAR2-AR5表达式分

2、析NoAR6AR7寄存器变量YesACC累加I器表达式分析/返回值NoP表达式分析NoT表达式分析NoC 语言和汇编语言的混 合编程(?语言 的寄存器规则状态位域保留值是在进入一个函数或从一个函数返回时 译器期望的该位域的值短横线表示编译器不期望一个特定的值被勺彥改栏表明编译器代码产生器是否曾修改该位域域名称保留值被修改ARP辅助寄存器指针1YesC进位位YesDP数据页YesOV溢出位YesOVM溢出模式0NoPM乘积移位模式0NoSXM符号扩展模式YesTC测试位YesC 语言和汇编语左的漩合编程今 C 语言的番存器规则; 堆栈指针、结构指针和局部变量指针 堆栈指针SP-AR1堆栈指针 S

3、P,指向堆栈的下一个可访问单元堆栈从低地址向高地址增长结构(frame)指针FP为一个函数要求局部存储时(如局部变量.暂存单元),它将 在堆栈中建立门己的操作空间(局部结构),该局部结构在函 数进入时在堆栈屮建立分配,在函数返回时释放分配 ARO结构指针 FP,指向当前结构的开始处-FP 指向的局部结构的第一个单元被用作暂时存储单元,以允许 寄存器之间的数据传输,且对于 C 函数的重入是必须的局部变量指针LVPAR2局部变杲指针 LVP所有存储在局部结构中的对彖,包括参数,都通过 LVP 进行间 接访问C 语言和汇编语左的 31 合编程今 C 语言的番存器规则寄存器变量::寄存器变量是局部变量

4、,位于寄存器中(不是存補器中) 的编译器的临时变量编译器使用这些寄存器变量的方式取决于是否使用了优 化器表达式分析寄存器f表达式分析寄存器用于计算表达式的值并保存临时的结表达式分析寄存器的内容在被调函数屮不被保护任何用于临时存储的表达式分析寄存器在函数调用前被 彳呆存汪局就结*勾中返回值函数返I叫值放在累加器屮C 语言和汇编语左的混合编程今 C 语左的禺数调用规 JW; 3C 语言的函数调用规则详如何产生函数调用 一个函数(父函数)在调用其它函数(子函数)执行以 下任务注意:ARP必须设为11)父函数将参数以颠倒的顺序压入堆栈,最右边声明的 参数第一个压入堆栈,最左边的参数最后一个压入堆栈,

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

6、SPIJOPD气;pep return aiiress, push on eoltware stackJFAROfU;push ARO (FP)SAR ARlf4厂SP = SPLW.KARO,SIZE;FP = size of fraKLAF. ARO/O*;FP=SP,SP= size = allocate framSAP.AR6宀;push AR6SAE AR7fU;push AR7;cede for tte functionNAF.;set ARP = SPNA.;point to saved AR7L.AR7/-;pep AR7L.AR6宀;pep AR6SEEKSI2EU;deal

7、locatGpoint to saved FPL.ARO/-;pep ?FSHD t;push return iddrow on haidvarG stackRET;returnBefcfeCM.LPushArguments.CalFuxaonAlccateLocalFrameCaller slocal tameArgumertflAjgjmert 1Returnaddress7) 设置 ARP 为 AR18) 如果 AR6 和/或 AR7 被保存,则恢复它们9) 释放局部结构分配10)恢复原 FP11)从软件堆栈屮复制返冋地址,并压入硬件堆栈12)返回父函数c 语 1和汇编语左 的混合编程(

8、?语 言的函数调用规则C 语言和汇编语左的混合编程今 C 语言的函数调用规则被调函数的特殊情况。没有将返回地址移到软件堆栈中如果被调函数(函数)没有调用其它函数,或只调用了一 个运行支持函数,且编译器知道该函数不会超过 8 级深度的调 用,即不会发生硬件堆栈的溢出,则就不必将返冋地址从硬 件堆栈中弹出,又压入软件堆栈中没有分配局部结构如果没有局部变量,也没有使用由 ARO (FP)指向的愆时存 储单元,则不必分配局部结构参数和局部变量的访问参数和局部变量通过LVP (AR2)來访问参数总是相对于FP的负偏移量局部变量总是相对于FP的正偏移量c 语言和汇编语言的泯合编程(?语言与汇编语言的樓口

9、4C 语言与汇编语言的接口独立的C和汇编模块接口在编写汇编语言时必须遵循冇关的寄存器规则和调用规 贝IJ,否则可能会破坏C的运行环境在编写独立的汇编程序时,必须注意以下儿点:无论是 C 函数还是汇编函数,都必须遵循寄存器使用规则必须保护函数要用到的几个专用寄存器,专用寄存器包扌乐ARO (FP)、AR1 (SP)、AR6 和 AR7;其中,如果 SP 正 常使用的话,则不必明确加以保护,即只耍汇编函数在返回 时弹出压入的对彖,实际上就已经保护了 SP其它寄存器可以自由使用c 语言和汇编语言的混合编程今 c 语言与 汇编语 ir的接口如果改变了状态位域的假定值,则函数返回时必须被恢复,ARP,必

10、须为 1中断程序必须保护所有用到的寄存器-汇编语言调用 C 函数时,将参数以逆序压入软件堆栈,函数1调用贡 弹出堆栈-调用 C 旳数时,C 函数只保护儿个专用寄存器,C 函数町能改变其它 任何寄存器的内容长整型和浮点数在存储器屮存放的顺序是低位字在低地址, 高位字在高地 it如果函数有返回值,则返冋值存放在累加器 ACC 中汇编程序不能改变由 C 产生的.cinit 段的内容,否则可能会引起不可 预测的后果-编译器在所有的 C 标识符(函数名.变量名等)前加下划线【人 1 此, 在编写汇编程序时, 必须在 C 程序要访问的对彖前加下划线 例如,在 C 程序中定义了变量 x,在汇编语言中使用时为

11、_x;如果仅在汇编语言中使用的标识符,则不必加下划线任何在汇编程序中怎义的对象或函数,如杲需要在 C 程序中访问或 调用,则必须用.global 汇编伪指令声明;同样,在 C 程序中定义的 对彖或函数,如果需要在汇编程序中访问或调 J1L 在汇编程序中也 必须用.global 汇编伪指令声明c 语言和汇编语言的混合编程今 c 语言与 汇编语立的接口例:C 程序 main 函数调用一个汇编函数 asmf unc, asmfun c函数只有 一个参数, 该参数 与 C 屮的全局变就 gvar 相加,返回该 结果extern int aamfunc() ; /* declare external a

12、sm f unction*/int gvar;/*define globalvariable*/main ()fint i;i = asmfunc(i); /call functionnormally/例中可以不必将返 回地址从硬件堆栈 移到软件堆栈中, 因为asmfunc 函数 没有进行别的调用asmfunc:POPDSARSARLARK LAR*4-AROr*4-ARlr*AROr1AROr*04#;Move return address eo C stack / Save FP;Save SP;Size of frameAR2 ;Set up FP and SPLDPK _gvar9Po

13、int to gvarSSXM fSet sign extensionLACgvar9Load gvarLARKAR2f-3 /Offset of argumentMAR*0-f9Point to argumentADDJ ARO Add arg to gvarSACL _gvar Save in gvarLARP ARI /Pop off frameSBRK2LARARO, Restore frame pointerPSHD rMove return addr to C2x stackRET(a) Cprogram(b)Assembl?语言和汇编语言的混合编程今 C语言与汇编语言的接口在C程

14、序中直接嵌入汇编语句在C程序中使用asm语句嵌入单行的汇编语句优点:简单,在 C 程序中可以实现 C 语言无法实现的一些硕 件控制功能,如修改中断控制寄存器、中断的是能或无效、 读取状态寄存器和中断标志寄存器等缺点:容易破坏 C 环境,因为 C 编译器不对嵌入的汇编语句 进行检测和分析注意-在 C 代码中嵌入跳转语句或标识符可能会产生无法预知的结 果不要改变 C 变量的值,但町以安全地读任何变量的当前值不耍嵌入汇编伪指令,这会破坏汇编语言环境?语言和汇编语言的混合编程今 C语言与汇编语言的接口在汇编语言中定义变量,变量名前加下划线 使用.global声明为全局变量在C程序中声明该变量为外部的,

15、并正常地对它访问asm (“ 汇编语句 ”);asm( “ DINT ”);/* 关中断 */asm( “ EINTM; /*开中断*/在C代码中访问汇编语言变量C 语言和汇编语言的混合编程(?语言与汇编语言的接口* Note the use of underscores in the following lines bEb_veirz1; Define匕he variable global_var; Declare it as external(a) C programextern float sine ; / This is the object*/f = sine |Q| ;/* Acc

16、ess sine as normal array*/(b) Assembly language program.global sine; Declare variable as externalsect_sine:floatfloatfloatsine_tabrr; Make a separate section;The table starts here0.00 0159870.022145C 语言和汇编语言的混合编程(?语言与汇编语言的接口在汇编语言中访问C程序变量:在C程序中定义全局变量在汇编语言中使用.global声明为外部变量,变量名前加 下划线在汇编程序屮正常地对变M访问intfloat x; main () global _i;.global

温馨提示

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

评论

0/150

提交评论