C及汇编语言的混合编程.ppt_第1页
C及汇编语言的混合编程.ppt_第2页
C及汇编语言的混合编程.ppt_第3页
C及汇编语言的混合编程.ppt_第4页
C及汇编语言的混合编程.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1 第五章C C 及汇编语言的混合编程 5 1ARMC C 编译器5 2在C C 程序中内嵌汇编指令5 3从汇编程序中访问C程序变量5 4汇编程序 C程序及C 程序相互调用5 5嵌入式C编程 2 5 1ARMC C 编译器 ARM集成开发环境中包含的C C 编译器 3 5 1ARMC C 编译器 ARM集成开发环境中C C 语言的库包括 ARMC语言库 ARMC语言库包括标准的C语言函数集 RogueWaveC 库 包含标准C 函数及基本C 对象 支持库 支持库提供了对不同种类的体系及处理器的支持 4 5 2在C C 程序中内嵌汇编指令 在C C 程序中使用内嵌的汇编指令的语法格式 在ARMC语言程序中 使用关键字 asm来标识一段汇编指令程序 asm 汇编语言程序 汇编语言程序 其中 如果一行中有多个汇编指令 指令之间使用分号 分开 在一条指令占多行 要使用续行符号 5 5 2在C C 程序中内嵌汇编指令 在C C 程序中内嵌汇编指令注意事项 必须小心使用物理寄存器 如R0 R3 IP LR和CPSR中的N Z C V标志位 因为计算汇编代码中的C表达式时 可能会使用这些物理寄存器 并会修改N Z C V标志位 asm MOVR0 xADDy R0 x y 计算x y时R0会被修改 在计算x y时R0会被修改 从而影响R0 x y的结果 用一个C程序的变量代替R0就可以解决这个问题 asm MOVvar xADDy var x y 内嵌汇编器探测到隐含的寄存器冲突就会报错 6 5 2在C C 程序中内嵌汇编指令 在C C 程序中内嵌汇编指令注意事项 不要使用寄存器代替变量 尽管有时寄存器明显对应某个变量 但也不能直接使用寄存器代替变量 intbad f intx x存放在R0中 asm ADDR0 R0 1 发生寄存器冲突 实际上x的值没有变化 return x 尽管根据编译器的编译规则似乎可以确定R0对应x 但这样的代码会使内嵌汇编器认为发生了寄存器冲突 用其他寄存器代替R0存放参数x 使得该函数将x原封不动地返回 这段代码的正确写法如下 intbad f int asm ADDx x 1 return x 7 5 3从汇编程序中访问C程序变量 在C程序中声明的全局变量可以被汇编程序通过地址间接访问 具体访问方法如下 使用IMPORT伪指令声明这个全局变量使用LDR指令读取该全局变量的内存地址 通常该全局变量的内存地址存放在程序的数据缓冲池中 根据该数据类型 使用相应的LDR指令读取该全局变量的值 使用相应的STR指令修改该全局变量的值AREAglobals CODE READONLYEXPORTasmsubIMPORTglovbvar 声明外部变量glovbvarasmsubLDRR1 glovbvar 装载变量地址LDRR0 R1 读出数据ADDR0 R0 1 加1操作STRR0 R1 保存变量值MOVPCLREND 8 5 4汇编程序 C程序及C 程序相互调用 在C 程序中使用C程序头文件在C 程序中使用C程序的系统头文件例 C code 这是一个C 程序 include 使用C程序的系统头文件Intmain 时可以直接调用 Return0 9 5 4汇编程序 C程序及C 程序相互调用 在C 程序中使用C程序头文件在C 程序中使用C程序的用户定义头文件 C code 这是一个C 程序Extern 在C 程序中使用伪指令extern C include my cheader1 h include my cheader1 h Intmain Return0 10 5 4汇编程序 C程序及C 程序相互调用 C程序调用汇编程序 汇编程序的设置要遵循ATPCS规则 保证程序调用时参数的正确传递 在汇编程序中使用EXPORT伪指令声明本子程序 使其它程序可以调用此子程序 在C语言程序中使用extern关键字声明外部函数 声明要调用的汇编子程序 即可调用此汇编子程序 11 5 4汇编程序 C程序及C 程序相互调用 C程序调用汇编程序调用汇编的C函数 includeexternvoidstrcopy char d constchar s 声明外部函数 即要调用的汇编子程 序intmain void constchar srcstr Firststring source 定义字符串常量chardstsrt Secondstring destination 定义字符串变量printf Beforecopying n printf s n s n srcstr dststr 显示源字符串和目标字符串的内容strcopy dststr srcstr 调用汇编子程序 R0 dststr R1 srcstrprintf Aftercopying n printf s n s n srcstr dststr 显示strcopy复制字符串结果return 0 12 5 4汇编程序 C程序及C 程序相互调用 C程序调用汇编程序被调用汇编子程序 AREASCopy CODE READONLYEXPORTstrcopy 声明汇编程序strcopy 以便外部程序引 用strcopy R0为目标字符串的地址 R1为源字符串的地址 LDRBR2 R1 1 读取字节数据 源地址加1STRBR2 R0 1 保存读取的1字节数据 目标地址加1CMPr2 0 判断字符串是否复制完毕BNEstrcopy 没有复制完毕 继续循环MOVpc lr 返回END 13 5 4汇编程序 C程序及C 程序相互调用 汇编程序调用C程序汇编程序的设置要遵循ATPCS规则 保证程序调用时参数的正确传递 在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数 在调用C程序时 要正确设置入口参数 然后使用BL调用 14 5 4汇编程序 C程序及C 程序相互调用 汇编程序调用C程序汇编调用C程序的C函数 函数sum5 返回5个整数的和 intsum5 inta litb intc intd inte return a b c d e 返回5个变量的和 15 5 4汇编程序 C程序及C 程序相互调用 汇编程序调用C程序汇编调用C程序的汇编程序AREAsample CODE READONLYIMPORTsum5 声明外部标号sum5 即C函数sum5 CALLSUMSTMFDSP LR LR寄存器放栈ADDR1 R0 R0 设置sum5函数入口参数 R0为参数aADDR2 R1 R0 R1为参数b R2为参数cADDR3 R1 R2 STRR3 SP 4 参数e要通过堆栈传递ADDR3 R1 R1 R3为参数dBLsum5 调用sum5 结果保存在R0ADDSP SP 4 修正SP指针LDMFDSP PC 子程序返回END 16 5 5嵌入式C编程 概述 C语言的优点是运行速度快 编译效率高 移植性好和可读性强 因此在嵌入式程序设计中经常会用到C语言程序设计 嵌入式C语言程序设计是利用基本的C语言知识 面向嵌入式工程实际应用进行程序设计 也就是说它首先是C语言程序设计 因此必须符合C语言基本语法 只是它是面向嵌入式的应用而设计的程序 17 5 5嵌入式C编程 C语言的 预处理伪指令 在嵌入式程序设计中的应用 1 文件包含伪指令格式 include 标准头文件 include 头文件名 h 自定义头文件2 宏定义伪指令其格式如下 格式 define宏标识符宏体例 defineU32unsignedint defineU16unsignedshort defineS32int defineS16shortint defineU8unsignedchar defineS8char 18 5 5嵌入式C编程 C语言的 预处理伪指令 在嵌入式程序设计中的应用 3 条件宏 先测试是否定义过某宏标识符 然后决定如何处理 这样做是为了避免重复定义 格式 ifdef宏标识符 undef宏标识符 define宏标识符宏体 else define宏标识符宏体 endif例 ifdefINCLUDE SERIAL undefNUM TTY defineNUM TTYN UART CHANNELS undefCONSOLE TTY defineCONSOLE TTY0 undefCONSOLE BAUD RATE defineCONSOLE BAUD RATE115200 endif 19 5 5嵌入式C编程 C语言的 预处理伪指令 在嵌入式程序设计中的应用4 条件编译伪指令格式 if 条件表达式1 elif 条件表达式2 elif 条件表达式n else endif这样 编译时 编译器仅对 if endif之间满足某一条件表达式的源文件部分进行编译 20 5 5嵌入式C编程 使用寄存器变量当对一个变量频繁被读写时 需要反复访问内存 从而花费大量的存取时间 为此 C语言提供了一种变量 即寄存器变量 这种变量存放在CPU的寄存器中 使用时 不需要访问内存 而直接从寄存器中读写 从而提高效率 寄存器变量的说明符是register 对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量 而循环计数是应用寄存器变量的最好候选者 例 求1 2 3 n的值 WORDAddition BYTEn registeri s 0 for i 1 i n i s s i returns 21 5 5嵌入式C编程 活用位操作使用C语言的位操作可以减少除法和取模的运算 在计算机程序中数据的位是可以操作的最小数据单位 理论上可以用 位运算 来完成所有的运算和操作 因而 灵活的位操作可以有效地提高程序运行的效率 例 方法1 inti j i 879 16 j 562 32 方法2 inti j i 879 4 j 562 562 5 5 22 5 5嵌入式C编程 活用位操作C语言位运算除了可以提高运算效率外 在嵌入式系统的编程中 它的另一个最典型的应用 而且十分广泛地正在被使用着的是位间的 非 操作 这跟嵌入式系统的编程特点有很大关系 例 rGPCDAT rGPCDAT 0 xFFFFFFF0 0 x0ErINTMSK BIT TIMER1 23 5 5嵌入式C编程 数据指针在嵌入式系统的编程中 常常要求在特定的内存单元读写内容 汇编有对应的MOV指令 而除C C 以外的其它编程语言基本没有直接访问绝对地址的能力 在嵌入式系统的实际调试中 多借助C语言指针所具有的对绝对地址单元内容的读写能力 以指针直接操作内存多发生在如下几种情况 某I O芯片被定位在CPU的存储空间而非I O空间 而且寄存器对应于某特定地址 两个CPU之间以双端口RAM通信 CPU需要在双端口RAM的特定单元 称为mailbox 书写内容以在对方CPU产生中断 读取在ROM或FLASH的特定单元所烧录的汉字和英文字模 例 int p int 0 xF000FF00 p 0 xABCD definerGPACON volatileunsigned 0 x56000000 rGPAC

温馨提示

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

评论

0/150

提交评论