第六讲-C与汇编语言混合编程分解.ppt

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六讲 C与汇编语言混合编程 C与汇编语言混合编程 ATPCS介绍 内嵌汇编 C和ARM汇编 程序间相互调用 一、ATPCS介绍 ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。 寄存器的使用规则 子程序间通过寄存器R0~R3来传递参数,这时,寄存器R0~R3可以记作A1~A4。 在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器 R4~R11可以记作V1~V8。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量 。 寄存器R12用作子程序间的scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。 寄存器R13用作数据栈指针,记作sp。 寄存器R14称为链接寄存器,记作lr。 寄存器R15是程序计数器,记作pc。 寄存器 别名 特殊名 使用规则 R0 a1 ? 参数/结果/scratch寄存器1 R1 a2 ? 参数/结果/scratch寄存器2 R2 a3 ? 参数/结果/scratch寄存器3 R3 a4 ? 参数/结果/scratch寄存器4 R4 v1 ? ARM状态局部变量寄存器1 R5 v2 ? ARM状态局部变量寄存器2 R6 v3 ? ARM状态局部变量寄存器3 R7 v4 wr ARM状态局部变量寄存器4 Thumb状态工作寄存器 R8 v5 ? ARM状态局部变量寄存器5 R9 v6 sb ARM状态局部变量寄存器6, 在支持RWPI的ATPCS中为静态基址寄存器 R10 v7 sl ARM状态局部变量寄存器7, 在支持数据栈检查的ATPCS中为数据栈限制指针 R11 v8 fp ARM状态局部变量寄存器8/帧指针 R12 ? ip 子程序内部调用的scratch寄存器 R13 ? sp 数据栈指针 R14 ? lr 连接寄存器 R15 ? pc 程序计数器 数据栈的使用规则 根据堆栈指针指向位置的不同 和增长方向的不同可以分为以下4种数据栈 : FD (Full Descending) 满递减 ED (Empty Descending)空递减 FA (Full Ascending) 满递增 EA (Empty Ascending) 空递增 ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。 参数的传递规则 参数个数固定的子程序参数传递规则: 第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递。 参数个数可变的子程序参数传递规则: 当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数 子程序结果返回规则: 结果为一个32位的整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。 二、内嵌汇编 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。 内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。 内嵌汇编指令的语法格式 __asm(“指令[;指令]”); ARM C汇编器使用关键字“__asm。如果有多条汇编指令需要嵌入,可以用“{}”将它们归为一条语句。如: __asm { 指令[;指令] … [指令] } 需要特别注意的是__asm是两个下划线。 内嵌的汇编指令的特点 操作数可以是寄存器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进行操作 。 内嵌的汇编指令中使用物理寄存器有一些限制。 常量前的符号“#”可以省略 只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。 不支持汇编语言中用于内存分配的伪操作。 指令中如果包含常量操作数,该指令可能会被汇编器展开成几条指令。 内嵌汇编器与armasm汇编器的区别 内嵌汇编器不支持通过“·”指示符或PC获取当前指令地址; 不支持LDR Rn,= expression伪指令,而使用MOV Rn, expression指令向寄存器赋值; 不支持标号表达式; 不支持ADR和ADRL伪指令; 不支持BX和BLX指令; 不

文档评论(0)

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

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

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档