嵌入式C语言程序设计基础剖析.ppt

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.4.1 内嵌汇编指令 (5)标号 C/C++程序中的标号可被内嵌的汇编指令使用。但只有B指令可使用C/C++程序中的标号,指令BL不能使用C/C++程序中的标号。 指令B使用C/C++程序中的标号格式: B{cond} label (6)内存单元的分配 所用的内存单元的分配都是通过C/C++程序完成的,分配的内存单元通过变量供内嵌的汇编器使用。 5.4.1 内嵌汇编指令 (7)SWI和BL指令的使用 内嵌SWI和BL指令中3个可选寄存器列表 ? 第1个寄存器列表中的寄存器用于存放输入的参数。 ? 第2个寄存器列表中的寄存器用于存放返回的参数。 ? 第3个寄存器列表中的寄存器的内容可能被被调用的子程序破坏,即这些寄存器是供被调用的子程序作为工作寄存器。 5.4.1 内嵌汇编指令 3.内嵌的汇编器与armasm的区别 在功能和使用方法上主要有以下特点: ? 不能写PC (mov pc,lr) ? 不支持伪指令LDR Rn,=expression,但可用指令: LDR Rn,expression来代替。 ? 除nop外,不支持ADR、ADRL等伪指令。 ? 指令中的C变量不要与任何物理寄存器重名 ? LDM/STM指令中的寄存器列表只能使用物理寄存器,不能使用C表达式 ? 不支持指令BX/BLX ? 用户不用维护数据栈 ? 不要轻易改变处理器模式。 ? 不支持内存分配操作 5.4.1 内嵌汇编指令 4.内嵌汇编指令的应用举例 下面是在ADS 1.2下编译通过程序,程序中内嵌汇编指令。 例5.14 字符串复制 本例中使用了指令BL调用子程序。在内嵌的BL指令中,除了正常的操作数外,还必须增加以下三个可选的寄存器列表: ? 第1个用于存放输入的参数 ? 第2个用于存放返回的结果 ? 第3个作为子程序的工作寄存器 程序代码如下: #include stdio.h void my_strcpy(char* src, const char* dst) { int ch; __asm{ loop: LDRB ch, [src], #1 STRB ch, [dst], #1 CMP ch, #0 BNE loop }; } int main(void){ const char* a = Hello World!; char b[20]; __asm{ MOV R0, a MOV R1, b BL my_strcpy, {R0, R1} }; printf(Original String: %s\n,a); printf(“Copied String: %s\n,b); return 0; } 例中主函数main(void)中的BL my_strcpy, {R0, R1}指令的输入寄存器列表为{R0, R1};它没有输出寄存器列表; 被子程序使用的工作寄存器为ATPCS的默认工作寄存器R0~R3、R12、lr以及PSR。 5.4.1 内嵌汇编指令 例5.15 使能和禁止中断 本例主要介绍怎样利用内嵌的汇编程序实现使能和禁止中断。 通过修改CPSR寄存器中的bit7可使能和禁止中断。但这些操作必须在特权模式下进行,因为在用户模式下不能修改寄存器CPSR中的控制位。源程序代码如下。 程序代码如下: __inline void enable_IRQ(void) { int tmp; __asm { MRS tmp,CPSR BIC tmp, tmp, #0x80 MSR CPSR_c, tmp } } __inline void disable_IRQ(void) { int tmp; __asm { MRS tmp, CPSR ORR tmp, tmp, 0x80 MSR CPSR_c, tmp } } int main(void) { disable_IRQ( )?; enable_IRQ( )?; } 5.4.2 从汇编程序中访问C程序变量 在C程序中声明的全局变量可被汇编程序通过地址间接访问。具体访问方法如下: ? 使用IMPORT伪操作声明该全局变量。 ? 使用LDR伪指令读取该全局变量的内存地址,通常该全局变量的内存地址值存放在程序的数据缓冲池中(literal pool)。 ? 根据该数据的类型,使用相应的LDR指令读取该全局变量的值;使用相应的STR指令修改该全局变量的值。 5.4.2 从

文档评论(0)

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

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

1亿VIP精品文档

相关文档