嵌入式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

相关推荐
Good白10195 小时前
嵌入式:1.嵌入式入门|初识嵌入式、处理器、ARM与STM32
arm开发·stm32·嵌入式硬件
물の韜1 天前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
女神下凡2 天前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
女神下凡6 天前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
NamoAmitabha1286 天前
ARM Cortex-A9 核心架构(演化后的“缝合怪”)--deepseek
arm开发·zynq--ps
AllData公司负责人6 天前
AllData 可定义数据中台完成信创适配|银河麒麟 + 海光X86 CPU / 华为鲲鹏ARM CPU+ OceanBase / 人大金仓国产化环境部署落地
大数据·arm开发·数据库·人工智能·oceanbase·kingbase
a5986527 天前
ARM服务器搭建云手机靠谱吗?个人自建方案优缺点总结
服务器·arm开发·智能手机·云手机
jiecy7 天前
在 ARM 的 UOS 系统里布署 WebDav
arm开发·docker·debian
女神下凡7 天前
芯参谋(87):Linux 系统(SPI NOR)驱动开发指南
linux·运维·arm开发·驱动开发·嵌入式硬件·设计规范