EDA365电子工程师网
标题:
内嵌汇编指令的应用举例
[打印本页]
作者:
sinsaina
时间:
2016-7-13 16:53
标题:
内嵌汇编指令的应用举例
下面是在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();
}
作者:
helendcany
时间:
2016-7-14 08:49
支持一下,很不错哦!
作者:
zhoumi
时间:
2016-7-14 15:08
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
作者:
jerryli
时间:
2016-7-18 19:12
支持楼主!谢谢分享!
作者:
Abricy
时间:
2016-9-8 14:42
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2