嵌入式ARM开发入门解析2

一、ARM指令集

1、移位

算术右移 (ASR):针对于有符号数, 最高位补符号位,需要考虑这个数值的符号位

逻辑右移 (LSR):针对于无符号数 ,最高位补0,不需要考虑这个数值的符号位

循环右移(ROR): 循环将移出的最低位补到最高位

2、mov

3、ldr

功能1:向寄存器中加载非立即数

功能2:将RAM中的数据加载到寄存器

4、str

将寄存器中的数据写入RAM指定空间中

5、bic

将寄存器中的值某几位清零(取决于立即数哪几位为1)

6、orr

将寄存器中的值某几位值1(取决于立即数哪几位为1)

7、S

NZCV位配合c位在有条件的情况下执行某些指令

8、b

无条件跳转

bl:函数调用时,会将返回地址保存到lr寄存器

b:函数调用时,无法将返回地址保存到lr寄存器

bx:跳转到lr寄存器对应返回地址

9、mrs

读取某个特殊寄存器的值到通用寄存器
10、msr

将某个通用寄存器的值写入到特殊寄存器

二、

1、栈的分类

空增栈

空减栈

满增栈

满减栈

增栈:入栈时,sp指针向上移动

减栈:入栈时,sp指针向下移动

空栈:先写数据再挪动指针

满栈:先挪动指针,再写数据

ARM内核使用的是满减栈:*--sp,先让sp--,再写数据

2、汇编调用C语言传参时

(1)如果参数少于或等于4个时,可以通过通用寄存器R0 - R3进行传参

(2)当参数超过4个时,必须通过栈进行传参(入栈 保护 出栈恢复)

(3)C语言函数返回的结果保存到R0寄存器

在c语言中调用汇编语言实现找最小值

3、修改工作模式

(1)将cpsr寄存器中的值读到通用寄存器中R0

(2)将R0寄存器中低5位的值先清0 (bic)

(3)将R0寄存器中的低5位置设置为:10000(orr)

(4)将R0寄存器中的值回写到CPSR寄存器

4、立即数判断的规则

(1)如果某个数的数值范围是0~0xFF之间,那么这个数一定是立即数;

(2)把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;

(3)这个数的二进制序列凑够8位之后的的右边必须为偶数个连续的 0

相关推荐
sunoo-22926 分钟前
【嵌入式 ARM 学习第十二天】SPI 裸机驱动 + I2C 触摸屏驱动 + 三大串行协议深度对比
arm开发·笔记·vscode·学习·imx6ull
ARM&开发(Haidong)1 小时前
ARM DMA硬件和驱动原理
arm开发
AOI小白新手上路1 小时前
4-3_ARM汇编_学习笔记
汇编·arm开发·学习
kkkkkkkkkk_Z2 小时前
新手自学嵌入式 | 学习日记:ARM架构初探与基础概念梳理
arm开发·学习·架构
SKH.2 小时前
ARM-lcd屏幕点亮
arm开发
傲世仙尊4 小时前
序列化与自定义协议-把结构体拆成字节流再拼回来
linux·服务器·网络·arm开发
脚踏实地,坚持不懈!4 小时前
Linux 内核源码解析:从 secondary_startup_64 到 pick_eevdf 的完整调用栈分析
android·linux·arm开发
斑马1394 小时前
ARM学习笔记(七)——LCD液晶显示
arm开发·笔记·学习
M78佐菲16 小时前
ARM学习笔记(11)
linux·arm开发·笔记·嵌入式硬件·学习
M78佐菲16 小时前
ARM学习笔记(10)
linux·arm开发·笔记·嵌入式硬件·学习