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();

}

凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值