在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 1480|回复: 0

[资料] 内嵌汇编指令的应用举例

[复制链接]
发表于 2016-3-9 16:29:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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访问凌阳教育官网

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-10 16:35 , Processed in 0.023307 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表