当前位置: 首页 > backend >正文

ARM汇编代码新手入门

为什么要学 ARM 汇编?

汇编是直接操作硬件的 “机器语言翻译”,在嵌入式开发中(如芯片驱动、实时系统)不可替代; 例:STM32 芯片的启动代码必须用汇编编写,因为 C 语言无法直接初始化 CPU 寄存器。

ARM 架构与寄存器(重点)

ARM 是什么

一种主流嵌入式处理器架构(手机、汽车芯片、物联网设备常用),我们以 32 位 ARMv7 架构为例(Cortex-M/R 系列通用)。

寄存器:CPU 内部的 “临时存储器”(比内存快 1000 倍),ARM 有 16 个通用寄存器(r0-r15),重点记住这几个特殊寄存器:

r0-r3:传递函数参数 / 返回值(类似快递盒);

sp(r13):栈指针(指向当前栈顶,类似 “临时工作台”);

lr(r14):链接寄存器(存函数返回地址,类似 “回家的路牌”);

pc(r15):程序计数器(存下一条要执行的指令地址,类似 “当前页码”)。

类比:寄存器就像厨房的 “调料罐”,常用的调料(数据)放在罐子里,炒菜(运算)时直接拿,比从仓库(内存)取快得多。

汇编程序基本结构

    .text        ; 代码段(存放指令).global main ; 声明程序入口
main:            ; 程序入口(类似C的main)mov r0, #5   ; r0 = 5(#表示常数)mov r1, #3   ; r1 = 3add r2, r0, r1 ; r2 = r0 + r1(结果8)bx lr        ; 程序结束(返回)

练习

  1. 写出mov r3, #10的作用。
  2. 补全程序:用sub指令实现r4 = r0 - r1(已知r0=8,r1=3)。

解析

1.mov r3, #10:将常数 10 存入寄存器r3r3 = 10)。

2.

mov r0, #8    ; r0 = 8
mov r1, #3    ; r1 = 3
sub r4, r0, r1 ; r4 = 8 - 3 = 5

基础指令与运算

1. 数据传送指令

  • mov rd, rnrd = rn(寄存器间传值);
  • mov rd, #immrd = 常数(传常数);
  • ldr rd, [rn]:从rn指向的内存读数据到rd(内存→寄存器);
  • str rd, [rn]:把rd的值写到rn指向的内存(寄存器→内存)。

2. 算术运算指令

  • add rd, rn, rmrd = rn + rm
  • sub rd, rn, rmrd = rn - rm
  • mul rd, rn, rmrd = rn × rm

练习

  1. 编写程序:计算10 - (2 + 3),结果存r5
  2. ldr/str指令实现:将内存地址0x20000000中的值加 10 后,写回原地址。

解析

1.

mov r0, #2    ; r0 = 2
mov r1, #3    ; r1 = 3
add r2, r0, r1 ; r2 = 2 + 3 = 5(先算括号内)
mov r3, #10   ; r3 = 10
sub r5, r3, r2 ; r5 = 10 - 5 = 5(最终结果)

2.

ldr r0, =0x20000000 ; r0 = 内存地址(=表示取地址)
ldr r1, [r0]        ; r1 = 从0x20000000读的值(假设原 value=5)
add r1, r1, #10     ; r1 = 5 + 10 = 15
str r1, [r0]        ; 把15写回0x20000000
  • ldr r0, =0x20000000:将内存地址存入r0(注意=的用法);
  • ldr/str配合[rn]实现内存访问。

程序流程控制(分支与循环)

1. 无条件跳转

b label:跳转到label标签(类似goto)。

2. 条件跳转(重点)

ARM 通过CPSR 寄存器(程序状态寄存器)的 “条件码” 判断跳转,常用条件:

eq(等于)、ne(不等于)、gt(大于)、lt(小于)。

指令格式:b<条件> label(如beq label:等于则跳转)。

例:if-else 逻辑

  cmp r0, r1   ; 比较r0和r1(结果存CPSR)beq equal    ; 若相等,跳equalmov r2, #0   ; 不相等:r2=0b end        ; 跳end
equal:mov r2, #1   ; 相等:r2=1
end:

3. 循环结构

用 “条件跳转 + 自增” 实现循环。

练习

  1. 编写程序:判断r0是否为偶数(提示:偶数的二进制末位为 0,用and指令)。
  2. 计算 1~5 的乘积(1×2×3×4×5),结果存r2

解析

1.判断偶数代码:

mov r0, #6    ; 假设r0=6(偶数)
and r1, r0, #1 ; r1 = r0 & 1(取末位,偶数末位0,奇数末位1)
cmp r1, #0    ; 比较r1是否为0
beq even      ; 若等于0,跳even
mov r2, #0    ; 奇数:r2=0
b endeven:
mov r2, #1 ; 偶数:r2=1
end:

2.

2. 计算乘积代码:  
```asm
mov r0, #1    ; r0=1(乘积初始值)
mov r1, #1    ; r1=1(当前数,从1开始)
loop:
mul r0, r0, r1 ; 乘积 = 乘积 × 当前数(1×1→1×2→2×3→...)
add r1, r1, #1 ; 当前数+1(1→2→3→4→5→6)
cmp r1, #6    ; 判断当前数是否>5(因为要乘到5)
blt loop      ; 若<6,继续循环
mov r2, r0    ; 结果存r2(r2=120)

函数调用与栈操作

1. 函数调用流程

  • 调用:bl 函数名(跳转 + 保存返回地址到lr);
  • 返回:bx lr(跳回lr存的地址)。

2. 栈的作用:保存现场

函数内部可能覆盖寄存器,需用栈保存状态:

  • push {r0-r3, lr}:压栈保存寄存器;
  • pop {r0-r3, pc}:出栈恢复(pc=lr实现返回)。

练习

  1. 编写函数sub_func,接收r0(a)和r1(b),返回a - b,在main中调用。
  2. 编写函数max,接收r0r1,返回较大的数。

解析

.global main
main:
mov r0, #10 ; a=10
mov r1, #3 ; b=3
bl sub_func ; 调用函数,返回值存 r0(10-3=7)
bx lrsub_func: ; 函数:返回 r0 - r1
sub r0, r0, r1 ; 计算差
bx lr ; 返回

2. 求最大值函数代码:  


.global main
main:
mov r0, #5    ; 参数1=5
mov r1, #8    ; 参数2=8
bl max        ; 调用max,返回值存r0(8)
bx lrmax:            ; 函数:返回r0和r1中的最大值
cmp r0, r1   ; 比较
bge greater  ; 若r0 >= r1,跳greater
mov r0, r1   ; 否则r0 = r1(让r0存较大值)
b end
greater:
; 若r0更大,无需操作
end:
bx lr        ; 返回r0

http://www.xdnf.cn/news/18025.html

相关文章:

  • 【人工智能99问】残差链接是什么,是如何起作用的?(28/99)
  • C语言相关简单数据结构:双向链表
  • 影刀 RAP 迁移华为云备忘录数据到得到笔记
  • C++编程实战:高效解决算法与数据结构问题
  • Python多线程、锁、多进程、异步编程
  • 自动驾驶中的传感器技术34——Lidar(9)
  • Python训练营打卡Day35-复习日
  • 2025年5月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(五)
  • Pandas 和 NumPy的区别和联系
  • 安卓开发中遇到Medium Phone API 36.0 is already running as process XXX.
  • RK3568平台开发系列讲解:PCIE trainning失败怎么办
  • 计算机网络 OSI 七层模型和 TCP 五层模型
  • day43_2025-08-17
  • git stash临时保存工作区
  • Talk2BEV论文速读
  • Next.js跟React关系(Next.js是基于React库的全栈框架)(文件系统路由、服务端渲染SSR、静态生成SSG、增量静态再生ISR、API路由)
  • 【Python】-- 机器学习项目 - 基于KNN算法的鸢尾花分类
  • 基于飞算JavaAI实现布隆过滤器防止缓存穿透:原理、实践与全流程解析
  • HTTP0.9/1.0/1.1/2.0
  • 免费照片压缩网站
  • Android原生(Kotlin)与Flutter混合开发 - 设备控制与状态同步解决方案
  • Visual Studio Code 基础设置指南
  • C++ 特殊类设计与单例模式解析
  • 云计算-K8s 实战:Pod、安全上下文、HPA 、CRD、网络策略、亲和性等功能配置实操指南
  • 天地图开发的优点
  • Leaflet赋能:WebGIS视角下的省域区县天气可视化实战攻略
  • PostgreSQL——用户管理
  • Dify 从入门到精通(第 38/100 篇):Dify 的实时协作功能
  • PIDGen!DecodeProdKey函数分析之四个断点
  • 优雅草星云物联网项目私有化定制技术解析:RS485接口与工业通讯协议-优雅草卓伊凡