马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。 (1)
字符串复制 本例主要介绍如何使用指令BL调用子程序。 注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。 示例 使用指令BL调用子程序 #include <stdio.h> void my_strcpy(char *src,const char *dst) { int ch; __asm { loop: #ifndef _asm /ARM版本/ LDRR ch,[src],#1 STRB ch,[dst],#1 #else /Thumb版本/ LDRB ch,[src] ADD dst,#1 #endif CMP ch,#0 BNE loop } } int main { const char *a="Hello world!"; char b[20]; __asm { MOV R0,a /设置入口设置/ MOV R1,b BL my_strcpy,{R0,R1} /调用my_strcpy()函数/ } printf("Original string:%s\n",a); printf("Copied string:%s\n",b); return 0; } 在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。 2)使能和禁止中断 本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。 使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改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(); } 凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网 |