ARM 开发基础

1. 什么是立即数?如何判断某数是否是合法 12 位立即数?

  • 立即数:在 ARM 指令中,直接包含在指令编码中的常数,无需从内存或寄存器加载。
  • 12 位立即数合法性判断 :ARM 指令中的立即数由一个 8 位常数和一个 4 位循环右移位数(rotate)编码而成。合法条件:该 32 位整数可以通过对一个 8 位无符号数,进行2×rotate位的循环右移得到(rotate取值为 0~15)。例如:
    • 0x3FC → 可由 8 位0xFF循环右移 30 位得到 → 合法
    • 0x101 → 无法由 8 位常数循环右移得到 → 非法

2. b, bl, bx指令的区别

指令 全称 功能 特点
b Branch 无条件跳转 仅修改 PC 寄存器,不保存返回地址
bl Branch with Link 带链接的跳转 跳转前将当前 PC 值保存到lr(r14),用于函数调用后返回
bx Branch and Exchange 带状态切换的跳转 跳转时根据目标地址的最低位切换指令集(0=ARM,1=Thumb)

3. ARM 内核采用的栈是哪种栈?

ARM 内核默认使用满递减栈(Full Descending Stack, FD)

  • 满栈 :栈指针sp指向最后一个被压入栈的有效数据。
  • 递减栈 :新数据压入时,sp的值减小(向低地址方向增长)。这也是 ARM 架构中函数调用的标准栈模型。

4. CPSR 中条件标志位,分别在什么情况下被置位

CPSR(Current Program Status Register)包含 4 个主要条件标志位:

  • N(Negative):运算结果最高位为 1 时置位,表示结果为负数(有符号数)。
  • Z(Zero):运算结果为 0 时置位。
  • C(Carry):无符号数加法产生进位,或减法产生借位时置位;移位操作时,最后移出的位会存入 C 位。
  • V(Overflow):有符号数运算发生溢出时置位(如正数 + 正数 = 负数,负数 + 负数 = 正数)。

5. ARM 汇编调用 C 语言函数以及 C 语言函数调用汇编编写的函数,函数参数和返回值如何处理

遵循ARM AAPCS(Architecture Procedure Call Standard)

汇编调用 C 函数
  1. 参数传递
    • 前 4 个参数依次放入r0-r3,超过 4 个的参数压入栈(满递减栈)。
    • 例如:func(a,b,c,d,e)r0=a, r1=b, r2=c, r3=d, e压栈。
  2. 返回值
    • 32 位返回值存入r0;64 位返回值存入r0+r1
  3. 调用流程 :使用bl func调用,返回时通过bx lr回到汇编代码。
C 函数调用汇编函数
  1. 参数传递 :C 编译器自动将前 4 个参数放入r0-r3,其余参数压栈,汇编函数直接从寄存器 / 栈中读取参数。
  2. 返回值 :汇编函数将结果存入r0(或r0+r1),C 函数从r0获取返回值。
  3. 汇编函数要求 :需遵守寄存器使用规则(如r4-r11为非易失性寄存器,使用前需保存到栈),并以bx lr返回。
相关推荐
森G2 小时前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
VekiSon5 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
AI+程序员在路上6 小时前
Nand Flash与EMMC区别及ARM开发板中的应用对比
arm开发
17(无规则自律)12 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞1 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠1 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟2 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9562 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt