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

相关推荐
zbyyd7 分钟前
Linux 基础与 Shell 命令
linux·运维·arm开发
振南的单片机世界1 天前
EXTI“一线多挂”陷阱:PA0和PB0同时触发,中断函数懵了
arm开发·stm32·单片机·嵌入式硬件
LCMICRO-133108477461 天前
国产长芯微LP4807完全P2P替代ADA4807,1mA、300MHz 增益带宽、电压反馈运算放大器
arm开发·嵌入式硬件·fpga开发·硬件工程·运算放大器·ada4807
LCMICRO-133108477461 天前
国产长芯微LP8628完全P2P替代AD8628,零漂移、单电源、输入输出轨到轨高精度运放
arm开发·嵌入式硬件·fpga开发·硬件工程·精密运放·ad8628
wechatbot8882 天前
极客互动企业微信 SCRM 私域运营实战效果全景
大数据·汇编·微信·自动化·企业微信·rpa
zlinear数据采集卡3 天前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
CIAS3 天前
uniontechos-server-20 1050 u2a pxe Server -x86 arm loongarch
arm开发
振南的单片机世界3 天前
推挽vs开漏:一个“强拉硬灌”,一个“只拉不管”
arm开发·stm32·单片机·嵌入式硬件
zlinear数据采集卡3 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
硅农程序猿4 天前
从需求到硅片| 一文讲清数字芯片设计流程
arm开发·硬件架构·risc-v