九、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 ...
随机推荐
- JNI写本地日志文件
调试JNI库 我喜欢反编译APK 然后替换.so文件 然后再编译成APK 其中写日志的话 用fopen("/sdcard/lei.txt","wb+")
- maven 成长之路
1配置maven 环境变量 新建系统变量 M2_HOME :E:\apache-maven-3.5.2 在系统变量 path中添加 E:\apache-maven-3.5.2\bin 运行 mvn - ...
- 【2】通过Ajax方式上传文件(图片),使用FormData进行Ajax请求
HTML: <form id= "uploadForm"> <p >指定文件名: <input type="text" name= ...
- httpd启动显示Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName'
AH00557: httpd: apr_sockaddr_info_get() failed for masterAH00558: httpd: Could not reliably determin ...
- 阶段3 1.Mybatis_08.动态SQL_01.mybatis中的动态sql语句-if标签
创建新的工程 复制到新建的项目里面 pom.xml依赖部分复制过来 dao中整理代码 只保留四个查询 映射文件也只保留四个查询方法 增加一个根据条件查询的方法. 由于用了别名,所以parpameter ...
- 阶段3 1.Mybatis_03.自定义Mybatis框架_5.自定义Mybatis的编码-创建两个默认实现类并分析类之间的关系
把XMLConfigBuilder的包名补全 这样我们就可以调用里面的loadConfiguration方法了 创建工厂实现类 实现SqlSessionFactory的接口 实现接口里面的方法 把cf ...
- css让字体细长
transform: scale(1,3); -ms-transform: scale(1,3); -webkit-transform: scale(1,3); -moz-transform: sca ...
- 成功秀了一波scala spark ML逻辑斯蒂回归
1.直接上官方代码,调整过的,方可使用 package com.test import org.apache.spark.{SparkConf, SparkContext} import org.ap ...
- 【Linux开发】如何查看Linux kernel的内置模块驱动列表和进程ID
[Linux开发]如何查看Linux kernel的内置模块驱动列表和进程ID 标签:[Linux开发] 命令: cat /lib/modules/$(uname -r)/modules.builti ...
- 右键windows terminal here无法进入当前目录
很久没写水笔了,简单记一水 使用windows terminal的基本上都自己改过注册表,添加到右键windows terminal here吧,用着很方便,哪里不会点哪里. 我起初删除掉starti ...