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返回。
相关推荐
CinzWS5 小时前
A53电源管理(下):DVFS与热管理的硬件实现——ARM芯片的“冷静艺术“
arm开发·嵌入式·芯片验证·原型验证·a53
誰能久伴不乏15 小时前
剥开协议的伪装:用 Wireshark 显微镜级拆解 TCP 握手与挥手
arm开发·tcp/ip·wireshark
somi715 小时前
ARM-驱动-10自定义通信协议
linux·arm开发·自用
疏星浅月1 天前
虚拟内存三大核心作用详解
linux·c语言·arm开发·嵌入式硬件
somi71 天前
ARM-驱动-08-LM75(I2C)和 ADXL345(SPI)
arm开发
somi72 天前
ARM-驱动-09-LCD FrameBuffer
arm开发·驱动开发·算法·自用
每天进步一点点️2 天前
透视 SOC 内部:APU Cluster 如何驱动 DB15 的 CAN/ETH 信号输出
arm开发·soc·芯片
xiaoyaohou112 天前
032、部署优化(三):OpenVINO与ARM平台(NCNN、TNN)部署
arm开发·人工智能·openvino
路溪非溪2 天前
抓取手机的蓝牙HCI日志并分析
linux·arm开发·驱动开发·智能手机
somi72 天前
ARM-05-Platform + DTS + GPIO子系统 + 中断 + 等待队列 + 错误处理
linux·运维·arm开发