swi 指令能用在C语言吗,内嵌汇编指令的应用举例
下面是在C語言程序中嵌入式匯編程序的例子。通過這幾個例子,可幫助用戶更好地理解內嵌匯編的特點及用法。
(1)? 字符串復制
本例主要介紹如何使用指令BL調用子程序。
注意,在內嵌的SWI和BL指令中,除了正常的操作數域外,還必須增加3個可選的寄存器列表。在這個程序中就能體現這一點。
示例 使用指令BL調用子程序
#include
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();
}
凌陽教育,專注嵌入式人才培養多年,完善的培養方案,強大的師資,合理的課程安排,成功從小白蛻變為嵌入式工程師。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的swi 指令能用在C语言吗,内嵌汇编指令的应用举例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动物百科知识:龙鱼如何养护?龙鱼是什么?
- 下一篇: 沉寂数年的戴尔G系游戏本这次能站稳吗?3