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();
}
凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。
swi 指令能用在C语言吗,内嵌汇编指令的应用举例相关推荐
- linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编
gcc编译c语言中内嵌汇编 --AT&T and Intel 汇编语法对照 寄存器命名: AT&T: %eax Intel: eax AT&T 语法源地址在左侧,目的地址在右 ...
- C语言中内嵌汇编asm语法
这篇文章写得炒鸡详细而且很全面,易于理解,建议新手查看 C语言中内嵌汇编asm语法 下面这两篇文章作为补充来看 C语言内嵌汇编:asm volatile C语言ASM汇编内嵌语法
- GCC在C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...
- linux中c语言常用内嵌汇编
源码地址 http://download.csdn.net/download/sinat_35360663/10224892 // // main2.c // allen // // Created ...
- vs2015c语言内嵌汇编,C#中内嵌资源的读取
起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...
- 【软件开发底层知识修炼】十二 C/C++语言中内嵌汇编语言(asm)
上一篇文章学习了链接脚本的语法与相关概念:链接脚本的概念 在继续学习链接器的内容的同时,先学习一个新内容:内嵌汇编. GCC编译器一般支持C/C++内嵌汇编语言,这样可以实现语言本身无法实现的内容.我 ...
- c语言转汇编编译器,【转】C语言内嵌汇编(asm)
TIPS:在编译过程汇中,汇编代码块是原封不动地送到汇编语言编译阶段的. 一.为什么会用到汇编? 1.为了提高速度和效率.不过这种情况很少了,现在C/C++编译器的优化很厉害了. 2.为了实现某些C语 ...
- c语言汇编call的参数,内嵌汇编—第7节:参数、局部变量、CALL原理
内嵌汇编-第7节:参数.局部变量.CALL原理 小风群:300275325 女神群:372452500(安卓,ISO,PC)全包揽,女神小敏期待你的加入哦. 这一节可能是大家最想明白的部分,想当初我为 ...
- 结合实例分析arm指令集中的adds指令与arm内嵌汇编
qq截图进来的图全部丢失了........郁闷...... 以下是ffmpege0.11.1源码中的一个函数,稍微做了点修改 注意:编译器我arm-linux-gcc4.4.1,其他的编译器请读者自行 ...
最新文章
- 倒计时1天 | 专属技术人的盛会,为你而来!
- opencv固定窗口在桌面的位置
- AI突破难题才能预见未来
- Vivado使用误区与进阶——XDC约束技巧之I/O篇 (下)
- 剑指 Offer 11. 旋转数组的最小数字 简单
- 求最大连续子序列和——解法1 – 暴力出奇迹||解法2 – 分治
- (Mybatis)XML配置解析
- 浅谈游戏视觉包装中的“情感化设计”
- setState如何知道该做什么?
- 如何不让你的APP在模拟器中运行。
- 测试心得:细说从逻辑到数据的用例设计
- git之windows下创建.gitignore文件
- Lazada新手卖家必看!只需掌握这三点,教你快速切入Lazada平台
- 四大国有银行股份制改革的确切时间
- 2019年MongoDB中文社区 长沙大会
- prince2 成功的项目管理_学员心得 | 宋文彬:学习PRINCE2的心路历程
- wms仓库管理系统的订单处理及流程
- amd服务器主板文件,AMD服务器主板全攻略--Opteron篇
- android 重启后进入安全模式_Android手机如何进入离开安全模式?
- openwrt linux rootfs 分区表,arm盒子快速移植OpenWrt rootfs
热门文章
- 知识图谱资源-NLP
- 关于maven依赖中的scopeprovided/scope使用
- android camera分辨率设置,请问如何使用camera2设置全屏preview,要求适配所有屏幕尺寸?...
- Swoole安装make报错 因为php-config配错
- mysql sql select_mysql SQL Select 语句 简单应用
- Java opengl openal_项目里用到了openal,特分享一下openal全教程
- MySQL中的find_in_set
- Apache与Tomcat整合
- cad 打开硬件加速卡_为什么我能用CAD“飙车”?因为我用了这些加速秘笈
- jAVA not find main_java编程时出现Could not find the main class 怎么解决???