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

相关推荐
AndyHeee3 天前
【SVC、PendSV(系统异常) 与 外设 IRQ 、NVIC笔记】
arm开发
暮云星影3 天前
瑞芯微rk3588利用Rockchip NPU运行大语言模型(LLM)
arm开发·人工智能·语言模型·自然语言处理
techdashen3 天前
绕过系统 ICMP:用 rawsock、Npcap 和 WMI 找到默认网卡
开发语言·arm开发·rust
ThornArmor3 天前
【工具篇·番外】跨语言生态的主权回收:基于 ISA 说明书的 4-bit 双向汇编系统全线封顶
c语言·开发语言·汇编·c++·重构·架构
振南的单片机世界3 天前
ARM中断比51快在哪?硬件压栈+NVIC集中管理
arm开发·stm32·单片机·嵌入式硬件
墨绿色的摆渡人3 天前
论文笔记(一百三十七)Learning Dual-Arm Push and Grasp Synergy in Dense Clutter
arm开发·论文阅读
暮云星影4 天前
全志linux开发屏幕适配(一)屏幕参数设置说明
linux·arm开发
是星辰吖~4 天前
WIN32_线程(下)
汇编
m0_547486664 天前
《ARM Cortex-M4嵌入式应用技术——基于STM32F407、STM32CubeMX与Proteus》全套PPT课件
arm开发·stm32·proteus
Lanceli_van4 天前
SQLite 3.45.2(sqlite-autoconf-3450200)ARM 交叉编译完整步骤
arm开发·sqlite