凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

内嵌汇编指令的应用举例

已有 502 次阅读| 2016-3-9 16:19 |个人分类:linux技术

下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。

(1)  字符串复制

本例主要介绍如何使用指令BL调用子程序。

注意,在内嵌的SWIBL指令中,除了正常的操作数域外,还必须增加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{R0R1}”指令的输入寄存器列表为{R0R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3R12LR以及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访问凌阳教育官网


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

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

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

GMT+8, 2024-4-27 08:54 , Processed in 0.029964 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部