下面是在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();

}

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

swi 指令能用在C语言吗,内嵌汇编指令的应用举例相关推荐

  1. linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编

    gcc编译c语言中内嵌汇编 --AT&T and Intel 汇编语法对照 寄存器命名: AT&T:  %eax Intel: eax AT&T 语法源地址在左侧,目的地址在右 ...

  2. C语言中内嵌汇编asm语法

    这篇文章写得炒鸡详细而且很全面,易于理解,建议新手查看 C语言中内嵌汇编asm语法 下面这两篇文章作为补充来看 C语言内嵌汇编:asm volatile C语言ASM汇编内嵌语法

  3. GCC在C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

  4. linux中c语言常用内嵌汇编

    源码地址 http://download.csdn.net/download/sinat_35360663/10224892 // // main2.c // allen // // Created ...

  5. vs2015c语言内嵌汇编,C#中内嵌资源的读取

    起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...

  6. 【软件开发底层知识修炼】十二 C/C++语言中内嵌汇编语言(asm)

    上一篇文章学习了链接脚本的语法与相关概念:链接脚本的概念 在继续学习链接器的内容的同时,先学习一个新内容:内嵌汇编. GCC编译器一般支持C/C++内嵌汇编语言,这样可以实现语言本身无法实现的内容.我 ...

  7. c语言转汇编编译器,【转】C语言内嵌汇编(asm)

    TIPS:在编译过程汇中,汇编代码块是原封不动地送到汇编语言编译阶段的. 一.为什么会用到汇编? 1.为了提高速度和效率.不过这种情况很少了,现在C/C++编译器的优化很厉害了. 2.为了实现某些C语 ...

  8. c语言汇编call的参数,内嵌汇编—第7节:参数、局部变量、CALL原理

    内嵌汇编-第7节:参数.局部变量.CALL原理 小风群:300275325 女神群:372452500(安卓,ISO,PC)全包揽,女神小敏期待你的加入哦. 这一节可能是大家最想明白的部分,想当初我为 ...

  9. 结合实例分析arm指令集中的adds指令与arm内嵌汇编

    qq截图进来的图全部丢失了........郁闷...... 以下是ffmpege0.11.1源码中的一个函数,稍微做了点修改 注意:编译器我arm-linux-gcc4.4.1,其他的编译器请读者自行 ...

最新文章

  1. 倒计时1天 | 专属技术人的盛会,为你而来!
  2. opencv固定窗口在桌面的位置
  3. AI突破难题才能预见未来
  4. Vivado使用误区与进阶——XDC约束技巧之I/O篇 (下)
  5. 剑指 Offer 11. 旋转数组的最小数字 简单
  6. 求最大连续子序列和——解法1 – 暴力出奇迹||解法2 – 分治
  7. (Mybatis)XML配置解析
  8. 浅谈游戏视觉包装中的“情感化设计”
  9. setState如何知道该做什么?
  10. 如何不让你的APP在模拟器中运行。
  11. 测试心得:细说从逻辑到数据的用例设计
  12. git之windows下创建.gitignore文件
  13. Lazada新手卖家必看!只需掌握这三点,教你快速切入Lazada平台
  14. 四大国有银行股份制改革的确切时间
  15. 2019年MongoDB中文社区 长沙大会
  16. prince2 成功的项目管理_学员心得 | 宋文彬:学习PRINCE2的心路历程
  17. wms仓库管理系统的订单处理及流程
  18. amd服务器主板文件,AMD服务器主板全攻略--Opteron篇
  19. android 重启后进入安全模式_Android手机如何进入离开安全模式?
  20. openwrt linux rootfs 分区表,arm盒子快速移植OpenWrt rootfs

热门文章

  1. 知识图谱资源-NLP
  2. 关于maven依赖中的scopeprovided/scope使用
  3. android camera分辨率设置,请问如何使用camera2设置全屏preview,要求适配所有屏幕尺寸?...
  4. Swoole安装make报错 因为php-config配错
  5. mysql sql select_mysql SQL Select 语句 简单应用
  6. Java opengl openal_项目里用到了openal,特分享一下openal全教程
  7. MySQL中的find_in_set
  8. Apache与Tomcat整合
  9. cad 打开硬件加速卡_为什么我能用CAD“飙车”?因为我用了这些加速秘笈
  10. jAVA not find main_java编程时出现Could not find the main class 怎么解决???