九、ARM 汇编与 C 的混合编程
9.1 ARM 汇编与 C 的混合编程
9.1.1 内嵌汇编 __asm
__asm("指令")
例如关闭/打开总中断开关 CPSR
__asm //使用 C 中变量名代替寄存器
{
MOV var,x
ADD y,var,x/y
}
内联汇编语言中的寄存器名被编译器视为 C 或 C++语言中的变量,所以内联汇编中出现的寄存器名不一定和同名的物理寄存器相对应。
这些寄存器名在使用前必须声明, 否则编译器将提示警告信息
9.1.2 汇编访问 C 中的全局变量
【1】用 IMPORT 声明全局变量
【2】利用 LDR 得到其地址
AREA globals, CODE, READONLY
EXPORT asmadd
IMPORT gvar; 声明外部变量 gvar
asmadd
LDR R1, =gvar; 装载变量地址
LDR R0, [R1] ; 读出数据
ADD R0, R0, #; 加 操作
STR R0, [R1]; 保存变量值
MOV PC, LR
END
9.1.3 ATPS(ARM-Thumb Produce Call Standard)
- ATPCS(ARM-Thumb Produce Call Standard): ARM 程序和 Thumb 程序中子程序调用的基本规则
- 子程序调用过程中寄存器的使用规则
- 利用 R0-R3 来传递参数, R4-R11 用来保存局部变量。
- 数据栈的使用规则
- 栈采用的是满递减(FD),当参数超过 4 个时, 超过的部分使用栈来传递参数, 返回值存于 R0
9.2 ARM 汇编 THUMB2 指令集
9.2.1 ARM THUMB THUMB2
- ARM 指令: 32 位, 支持所有功能, 所有指令都可以条件执行
- THUMB: 16 位, 不能访问协处理器, 特权指令和特殊功能指令, 只有 B 指令才能条件执行
- THUMB2: Thumb-2 是 16 位 Thumb 指令集的一个超集, 指令是 32 位或者是 16 位。与 ARM 指令 32 位编码格式是不同的。由汇编器来决定使用 16 位指令还是 32 位指令。
9.2.2 ARMV8(64bit 体系结构)
- ARMv8 提供 AArch32state 和 AArch64 state 两种 Execution State, 不在区分 ARM 状态与 THUMB 状态。
- 在 AArch32 状态下, 提供两个指令集 A32(32bit)、 T32(16/32bit), 两种指令是通过 BX 切换的。
- 在 AArch64 状态下, 只支持 A64 指令集, 固定长度为 32bit.
- ARMV8 提供了不同的运行级别: Exception Level 与 Security (EL0(app), EL1, EL2,EL3) 类比于 X86 的 Ring0-ring3(app)
9.2.3 CORTEX-M3
- Cortex-M3 只支持 Thumb-2 指令, 在 STM32 单片机课程中会详细讲解 Thumb-2 指令集。
九、ARM 汇编与 C 的混合编程的更多相关文章
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
- ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
要学习一个东西首先要把概念搞清楚,以下仅仅是自己的一些关于汇编的理解. 可运行文件里的01码是机器码,机器码不等于汇编码,尽管机器码能够非常easy翻译成汇编码. 汇编码中包括非常多汇编指令.伪指令和 ...
- ARM汇编中一些重要伪指令
IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的 EXPORT ,表示本程序里面用到的变量提供给其他模块调用的. 以上两个在汇编和C语言混合编程的时候用到 ENDP 表示PRO ...
- ARM中C和汇编混合编程及示例(转)
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...
- c语言环境初始化&c语言和汇编混合编程
bootloader通常会分为两个阶段:第一阶段采用汇编语言来编写,主要是一些核心的初始化工作(内存,时钟的初始化),第二阶段使用C语言来编写,主要是它会完成一些板载硬件的初始化(串口,网口)然后其启 ...
- ARM汇编编程基础之一 —— 寄存器
ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 ...
- 3.1 ARM汇编编程概述
1. 汇编编程 为什么要学习汇编 1). Bootloader初始化 2). Linux kernel 3). 高效 2. ARM汇编分类 1. ARM标准汇编:ARM公司得汇编器适合在Windows ...
- ARM汇编编程概述
1.为什么需要学些汇编指令 2.ARM汇编指令分类 3.汇编程序框架 4.编程准备 +++++++++++++++++++++++++++++++++++ 1.为什么需要学些汇编指令 bootload ...
- C51与汇编混合编程详解
C51和汇编混合编程(1)-C语言中嵌入汇编 1.在 C文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ;Assembler Code Here #pragma ENDASM ...
随机推荐
- JavaScript 事件不触发
在class上绑定的事件,点击图片的时候无法触发 <div id="files" class="files"> <div> <p& ...
- iOS SDK开发之 .a静态库
查看.framework静态库的生成及使用单击此处 注:这篇教程将只使用一小部分Objective-C代码,本文主要讲解从开始到应用的详细步骤.环境:xcode 9.2下面我们开始操作: 第一步:创建 ...
- ef和ashx的简单测试
在这里.小弟我默默的计算了一下用一般处理程序和MVC配合EF,到底哪个快,事实问题是我感觉都差不多,因为用的是EF,所以要提高访问速率,我觉得还是要从数据访问做起: 一般处理程序代码: private ...
- Webpack的tapable 为什么要使用 new Funtion 来生成静态代码
为了保持代码的单态(monomorphism). 这涉及到了js引擎优化的一些问题, tapable从1.0.0版本开始就用new Function来生成静态代码最后来来执行, 以确保得到最优执行效率 ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_3 mybatis连接池的分类
2.mybatis中的连接池 mybatis连接池提供了3种方式的配置: 配置的位置: 主配置文件SqlMapConfig.xml中的dataSourc ...
- 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第4节 maven生命周期和概念模型图_09maven概念模型图
项目自身的信息 项目运行所依赖的扎包 运行环境信息:tomcat啊,JDK啊这些都属于运行环境 一个jar包的坐标由三个最基本的信息组成. 第一部分就是依赖管理. 第二个部分
- robot framework断言
一.基础 RobotFramework带有丰富的系统关键,使用时无需导入,直接使用,为写自动化用例带来了极大的方便:不能停留在知道或者是会得程度,只有熟练使用各关键字,才能提升自动化用例的写作效率.下 ...
- HTTP学习记录:四、头信息(请求和响应)
学习资源主要为:@小坦克HTTP相关博客 一.请求头信息(Request Header) 请求头信息包含比较多,如下: 1.Cache头域 if-modified-Since 作用:把浏览器端缓存页面 ...
- 机器学习实战-K-近邻算法(kNN)
k-近邻算法(kNN)---它的工作原理是:存在一个样本数据集合,也称做训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每 ...
- LTUI v1.1, 一个基于lua的跨平台字符终端UI界面库
简介 LTUI是一个基于lua的跨平台字符终端UI界面库. 此框架源于xmake中图形化菜单配置的需求,类似linux kernel的menuconf去配置编译参数,因此基于curses和lua实现了 ...