swi 指令能用在C语言吗,内嵌汇编指令的应用举例
下面是在C語(yǔ)言程序中嵌入式匯編程序的例子。通過(guò)這幾個(gè)例子,可幫助用戶(hù)更好地理解內(nèi)嵌匯編的特點(diǎn)及用法。
(1)? 字符串復(fù)制
本例主要介紹如何使用指令BL調(diào)用子程序。
注意,在內(nèi)嵌的SWI和BL指令中,除了正常的操作數(shù)域外,還必須增加3個(gè)可選的寄存器列表。在這個(gè)程序中就能體現(xiàn)這一點(diǎn)。
示例 使用指令BL調(diào)用子程序
#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??????????????? /*設(shè)置入口設(shè)置*/
MOV R1,b
BL my_strcpy,{R0,R1}??? /*調(diào)用my_strcpy()函數(shù)*/
}
printf("Original string:%s\n",a);
printf("Copied string:%s\n",b);
return 0;
}
在這個(gè)例子中,主函數(shù)main()中的“BL_strcpy,{R0,R1}”指令的輸入寄存器列表為{R0,R1},沒(méi)有輸出寄存器列表。子程序使用的工作寄存器位ATPCS默認(rèn)工作寄存器R0~R3、R12、LR以及PSR。
2)使能和禁止中斷
本例主要介紹如何利用內(nèi)嵌匯編程序來(lái)使能和禁止中斷。
使能和禁止中斷是通過(guò)修改CPSR寄存器中的位7完成的。這些操作必須在特權(quán)模式下進(jìn)行,因?yàn)樵谟脩?hù)模式下不能使用修改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();
}
凌陽(yáng)教育,專(zhuān)注嵌入式人才培養(yǎng)多年,完善的培養(yǎng)方案,強(qiáng)大的師資,合理的課程安排,成功從小白蛻變?yōu)榍度胧焦こ處煛?/p> 與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的swi 指令能用在C语言吗,内嵌汇编指令的应用举例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 动物百科知识:龙鱼如何养护?龙鱼是什么?
- 下一篇: android微信电话锁屏,iPhone