




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 ARM C程序开发,在应用系统的程序设计中,若所有的编程任务均用汇编语言来完成,其工作量是可想而知的,同时,不利于系统升级或应用软件移植。 事实上,ARM体系结构支持C/C+以及与汇编语言的混合编程,在一个完整的程序设计中,除了初始化部分用汇编语言完成以外,其主要的编程任务一般都用C/C+完成。,汇编语言与C/C+的混合编程通常有以下几种方式: 在C/C+代码中嵌入汇编指令; 在汇编程序和C/C+的程序之间进行变量的互访; 汇编程序、C/C+程序间的相互调用。,Semihosting 在ADS的C语言函数库中,某些ANSI C的功能是由主机的调试环境来提供的,这套机制有一个专门术语叫S
2、emihosting。Semihosting通过一组软件中断(SWI)指令来实现。 当一个Semihosting软中断被执行时,调试系统先识别这个SWI请求,然后挂起正在运行的程序,调用Semihosting的服务,完成后再恢复原来的程序执行。因此,主机执行的任务对于程序来说是透明的。,4.1 C语言内嵌汇编语言程序开发,在C程序中嵌入汇编程序,可以实现一些高级语言所没有的功能,提高程序执行效率。 armcc编译器的内嵌汇编器支持ARM指令集,tcc编译器的内嵌汇编器支持Thumb指令集。 1. 内嵌汇编的语法 _asm 指令;指令 *注释* 指令 ,4.1.1 内嵌汇编的指令用法,(1) 操
3、作数 内嵌的汇编指令中作为操作数的寄存器和常量可以是C表达式。 这些表达式可以是char、short或int类型,而且这些表达式都是作为无符号数进行操作。 若需要有符号数,用户需要自己处理与符号有关的操作。 编译器将会计算这些表达式的值,并为其分配寄存器。,(2) 物理寄存器 内嵌汇编中使用物理寄存器有以下限制: 不能直接向PC寄存器赋值,程序跳转只能使用B或BL指令实现。 使用物理寄存器的指令中,不要使用过于复杂的C表达式。因为表达式过于复杂时,将会需要较多的物理寄存器。这些寄存器可能与指令中的物理寄存器在使用时发生冲突。 编译器可能会使用R12或R13存放编译的中间结果。在计算表达式的值时
4、可能会将寄存器R0R3、R12和R14用于子程序调用。因此,在内嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理存储器。 通常内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而影响代码的效率。,(3) 常量。在内嵌汇编指令中,常量前面的“#”可以省略。 (4) 指令展开。内嵌的汇编指令中,如果包含常量操作数,则该指令有可能被内嵌汇编器展开成几条指令。 (5) 标号。C程序中的标号可以被内嵌的汇编指令使用。但是只有指令B可以使用C程序中的标号,而指令BL则不能使用。 (6) 内存单元的分配。所有的内存分配均由C编译器完成,分配的内存单元通过变量供内嵌汇编器使用。内嵌
5、汇编器不支持内嵌汇编程序中用于内存分配的伪指令。,内嵌汇编器不支持通过“.”指示符或PC获取当前指令地址; 不支持“LDR Rn,expr”伪指令,而使用“MOV Rn,expr”指令向寄存器赋值; 不支持标号表达式;不支持ADR和ADRL伪指令; 不支持BX指令; 不能向PC赋值。 当使用8位移位常数导致CPSR的ALU标志更新时,N、Z、C和V标志中的C不具有真实意义。,4.1.2 内嵌汇编器与armasm汇编器的差异,4.1.3 内嵌汇编注意事项,(1)必须小心使用物理寄存器. 如R0R3、PC、LR和CPSR中的N、Z、C和V标志位,因为计算汇编代码中的C表达式时,可能会使用这些物理寄
6、存器,并会修改N、Z、C和V 标志位。 例如: _asm MOVS var,x ADDNE y,var,x/y 计算x/y时CPSR会被修改。内嵌汇编器探测到隐含的寄存器冲突就会报错。,(2)不要使用寄存器代替变量。 尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变量。 例如: int bad_f(int x) / x存放在R0中 _asm ADD R0,R0,#1 /发生寄存器冲 突,实际上x的值并没有变化 return(x); ,尽管根据编译器的编译规则似乎可以确定R0对应x,但这样的代码会使内嵌汇编器认为发生了寄存器冲突。 用其它寄存器代替R0存放参数x,使得该函数将x原封不
7、动地返回。 这段代码的正确写法如下: int bad_f(int x) _asm ADD x,x,#1 return(x); ,(3) 使用内嵌式汇编无需保存和恢复寄存器。 事实上,除了CPSR和SPSR寄存器,对物理寄存器先读后写都会引起汇编器报错。 例如: int f(int x) _asm STMFD SP!,R0 /保存R0。先读后写,汇 编出错 ADD R0,x,1 EOR x,R0,x LDMFD SP!,R0 return(x); ,(4)LDM和STM指令的寄存器列表中只允许使用物理寄存器。 内嵌汇编可以修改处理器模式、协处理器模式以及FP、SL、SB等APCS寄存器。但是编译
8、器在编译时并不了解这些变化,因此必须保证在执行C代码前恢复相应被修改的处理器模式。,(5) 汇编语言中的“,”号作为操作数分隔符。 如果有C表达式作为操作数,若表达式中包含有“,”,则必须使用符号“(”和“)”将其归约为一个汇编操作数。 例如: _asm ADD x,y,(f(),z) /“f(),z”为一个带有“,” 的C表达式 ,4.1.4 例子,例4-1 #include int main() printf(Hello,ARM C world!n); return 0; ,例4-2 #include int main() int i,j; printf(please input i,j:
9、n); scanf(%d,%d, ,例4-3 字符串到数组的复制 #include void my_strcpy(const char * src, char * dst) int ch; _asm LOOP: LDRBch,src,#1 STRBch,dst,#1 CMPch,#0 BNELOOP ,int main() const char *a = Hello,World!; char b20; my_strcpy(a,b); printf(Original String: %sn,a); printf(Copied String: %sn,b); return 0; ,例4-4 使能禁能IRQ中断 _inline void enable_IRQ(void) int tmp; _asm /嵌入汇编代码 MRS tmp,CPSR /读取CPSR的值 BIC tmp,tmp,#0 x80 MSR CPSR_c,tmp ,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版医药市场场调研合同协议书范本
- 2025版网络安全监测与预警合同
- 二零二五年度房产金融服务补充协议书范本
- 二零二五年度大型木材原料采购及销售合作协议
- 2025年度绿色环保二手电动汽车买卖合同范本
- 2025版私人墓地购置与墓园社区共建合作协议
- 二零二五年电影后期制作设备与技术支持合同
- 2025版房地产海外市场拓展合作合同
- 二零二五年度房地产工程建设贷款合同(含建筑废弃物资源化利用)
- 二零二五年度货运汽车租赁及车辆租赁违约责任合同
- 维克多高中英语3500词汇
- 10KV高压电缆课件
- 艾默生EV2000变频器主要参数设置
- 餐饮行业服务食品安全风险评估表
- 附件4气象业务系统mdos操作平台用户使用手册
- JJF 1910-2021电化学工作站校准规范
- 公司慰问金签收单模板
- ks-s3002腔全自动刻蚀机规格书
- 资产损失税前扣除的审核课件
- 食材配送难点分析及应对措施方案
- 2022年安全生产文明施工措施费使用计划表(完整)
评论
0/150
提交评论