尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ARM汇编语言
preserve8 area reset, code, readonly code32 entry1.preserve8伪指令告诉汇编器该段代码要保持 8 字节栈对齐。ARM ABI 规范函数调用要求栈指针 SP 必须 8 字节对齐否则浮点、C 库函数会崩溃。作用汇编器生成代码时保证栈操作满足 8 字节对齐C 和汇编混编时必须加否则 C 代码运行异常。2.area reset, code, readonlAREA伪指令定义一个段 (Section)reset段名自定义这里叫 reset 复位段code段类型这是代码段放可执行指令readonly属性只读放到 Flash/ROM 里不能写。等价于新建一个名为 reset 的只读代码段复位向量表就放在这个段。3.code32伪指令告诉汇编器下面的代码编译成ARM32 位指令集不是 Thumb16 位指令。ARM 处理器复位后默认工作在 ARM32 状态所以复位启动段必须写code32。对比code16代表 Thumb‑16 位指令。4.entry伪指令标记程序入口点。告诉链接器这个位置是程序启动入口复位之后 CPU 从此处开始执行指令。一个工程里只能有一个 ENTRY。由于异常处理向量表的地址是从0x00开始偏移所以起始的物理地址都要留给异常处理函数的向量表软中断swi及其处理函数preserve8 ; 堆栈8字节对齐ARM ABI要求压栈操作保证双字对齐 area reset, code, readonly ; 定义段段名reset代码段只读 code32 ; 下面是ARM32位指令不是Thumb entry ; 程序入口标记链接器把此处放0地址 ; ARM 标准异常向量表每个向量4字节只能放跳转指令/ nop b rst ; 0x00 复位异常跳转到rst复位入口代码里没写rst标签 nop ; 0x04 未定义指令异常 Undefined Instruction这里直接nop没有处理 b deal_swi ; 0x08 **SWI软中断异常**发生swi指令跳转到deal_swi处理函数 nop ; 0x0C 预取中止 Prefetch Abort未处理 nop ; 0x10 数据中止 Data Abort未处理 nop ; 0x14 保留ARM预留向量位 nop ; 0x18 IRQ普通中断未处理 nop ; 0x1C FIQ快速中断未处理 deal_swi stmfd sp!, {r4-r12, lr} ;保护现场 sub r1, lr, #4 ;lr回退四位就是SWI 这条指令本身的内存地址 ldr r2, [r1] ;从 r1 地址读取内存把整条swi #xx机器码读到 r2 寄存器。 bic r0, r2, #(0xff 24) bic位清零。0xff 24 屏蔽最高 8 位操作码把机器码高 8 位 清掉取出低 8 位 SWI 调用号存入 r0。 import c_deal_swi IMPORT告诉汇编器c_deal_swi 是外部 C 函数符号 ;不在本汇编文件链接的时候去找 C 代码。 bl c_deal_swi 跳转链接调用 C 语言写的软中断处理函数 ;c_deal_swi(uint8_t swi_num) 执行完 C 函数返回回到这条 bl 下一条。 ldmfd sp!, {r4-r12, pc}^ ;带模式切换的恢复现场异常复位rst入口及其处理函数rst ldr sp, 0x40001000 ;把地址0x40001000加载到当前模式的 SP 栈指针。 mrs r0, cpsr ;读状态寄存器把 CPSR (当前程序状态寄存器) ;完整读到通用寄存器 r0。 bic r0, r0, #0x1f ;BIC 按位清零0x1f 0b11111清除 r0 的低 5 位。 orr r0, r0, #(1 4) ;User 用户模式0b10000 → 0x10 msr cpsr_c, r0 ;切换工作模式到user ;后缀_c代表只修改 CPSR 的控制域 ldr sp, 0x40000c00 ;给刚刚切换完成的 User 模式栈指针 ;SP_user 赋值 0x40000c00。函数调用中的传参和带出返回值问题mov r0, #1 ; 将立即数1送入r0寄存器作为asm_add的第1个入参 mov r1, #2 ; 将立即数2送入r1寄存器作为asm_add的第2个入参 bl asm_add ; 函数调用①把下一条指令地址存入LR(返回地址) ; 跳转到asm_add标签处执行 asm_add: stmfd sp!, {r4‑r12, lr} ;保护现场 ; stmfd满递减栈批量存储sp!写完后自动更新sp ; 把 r4~r12 以及链接寄存器LR压入栈。 ; 1.r4‑r12AAPCS规定被调用函数如果修改这些寄存器返回前必须恢复原值 ; 2.LR压栈因为asm_add内部如果再bl调用其他函数LR会被覆盖先保存返回地址。 add r0, r0, r1 ; r0 r0 r1。r0同时承担入参和返回值角色。 ; 入参r01r12运算后r03函数返回值就放在r0。 ldmfd sp!, {r4‑r12, pc} ;恢复现场 ; ldmfd满递减栈批量加载sp!读取后自动恢复栈指针 ; 从栈中依次弹出栈里保存的 r4‑r12最后把栈上保存的LR值直接加载到PC程序计数器。 ; PC被赋值为原来的返回地址CPU直接跳回bl的下一条指令**等价于 bx lr**。传参规则第 14 个参数寄存器 R0,R1,R2,R3参数依次填入 R0、R1、R2、R3不需要压栈。第 5 个及往后参数压入栈栈传参超出 4 个的参数从最右参数开始压栈由调用者 (caller) 负责入栈函数内部从栈上读取。如果传入参数的个数超过4个并且没有进行入栈后续参数的处理调用函数后同样会对栈进行读取参数的操作不过读取出的参数是栈内的随机值核心寄存器使用约定寄存器用途R0‑R3参数寄存器前 4 个函数参数依次放 R0、R1、R2、R3R0返回值寄存器函数返回结果放到 R064 位返回值R0 存低 32 位R1 存高 32 位R4‑R11被调用者保存寄存器 (callee‑saved)函数内部要用必须压栈保存返回前恢复R13(SP)栈指针满递减栈栈向下增长R14(LR)链接寄存器保存函数返回地址bl指令会自动把返回地址写入 LRR15(PC)程序计数器数据处理指令条件码其中AL为默认状态不需要单独指出在CPSR寄存器中有这四位条件标志位用来标识计算过程中是否产生进位借位同时使用比较命令cmp的同时也会对四位标志位产生影响从而使得后续可以进行条件执行实现c语言中的while循环if条件判断等cmp Ra, R1时比较的是无符号数关系条件ZCRa RbEQ1×Ra ! RbNE0×Ra ≥ RbHS/CS0/11Ra RbLO/CC00Ra RbHI01Ra ≤ RbLS1 / 01 / 0有符号比较看 N、V、Z核心N ^ VV1 代表本次减法发生有符号溢出此时 N 符号位不可信。N ^ V 0→ Ra ≥ RbGEN ^ V 1→ Ra RbLT关系条件ZN^VRa RbEQ1×Ra ! RbNE0×Ra ≥ RbGE0/10Ra RbLT01Ra RbGT00Ra ≤ RbLE1 / 01 / 0练习跳转和条件码实现1-100的累加mov r0, #0 mov r1, #1 loop: cmp r1, #100 ; 更新NZCV判断 r1 100 ble do_add ; 有符号 ≤100则去执行相加 b exit ; 否则直接退出 do_add: add r0, r0, r1 add r1, r1, #1 b loop exit: ; r0存放结果5050立即数传入规则:所有为 1 的 bit经过【循环左移偶数位】之后全部能塞进连续 8bit 里面就是合法立即数。移位只能是循环左移并且移位位数一定是偶数0,2,4…300x104二进制0000 0000 0000 0000 0000 0001 0000 0100循环左移 2 位0x104二进制0000 0000 0000 0000 0000 0100 0001 0000其中连续的8bit可以完全表示因此0100 0001就是0x41所以立即数就是imm8 0x41 rotate2只有右移后能放在8bit里的数字才是合法的立即数不然就只能分段传输拆分成两个合法的立即数先传一半后传一半。1. LDRLoad Register 从内存加载数据到寄存器LDR R0, [R1] ; R0 *R1把R1指向内存地址的数据读到R0 LDR R0, [R1, #4] ; R0 *(R1 4)基址偏移寻址 LDR R0, 0x12345678 ; 伪指令把立即数加载到R0会放到文字池literal pool⚠️区分LDR 伪指令 vs LDR 机器指令LDR Rd,imm不是内存读是汇编器帮你生成文字池LDR Rd,[Rn]才是真正访存。2. STRStore Register 寄存器数据写入内存STR R0, [R1] ; *R1 R0把R0的值存到R1指向的内存地址 STR R0, [R1, #-4] ; *(R1 -4) R0LDR/STR 是 ARM 唯一访存指令ARM 不能直接 MOV 内存和内存之间数据必须经过寄存器。3. BBranch 无条件跳转不保存返回地址B label ; 跳转到labelPC labelLR不变无法返回跳转范围ARM 状态 ±32MB单纯跳转不会记录返回点一般用于死循环、分支跳转。4. BLBranch and Link 带链接跳转保存返回地址BL func ; LR PC-4保存下一条指令地址PC func调用函数执行两步LR ← 当前PC偏移保存返回地址PC ← 目标地址函数结尾用MOV PC, LR返回。只能在同 ARM 状态跳转不能切换 ARM ↔ Thumb。5. BLXBranch and Link Exchange 跳转 可选切换指令集BLX R0 ; 跳转到R0地址R0最低位1 → 切Thumb最低位0 → ARM同时LR保存返回地址 BLX label ; 标签跳转自动切换ARM/Thumb特点自动把返回地址存入 LR支持函数调用可以切换 ARM ↔ Thumb 工作模式BL 做不到目标在寄存器时常用用于函数指针调用BL同状态跳转BLX可跨 ARM/Thumb。6. STMFDStore Multiple Full Descending 多寄存器压栈满递减栈ARM 默认栈满递减 FDFull Descending栈从高地址往低地址增长SP 指向最后一个入栈元素。STMFD SP!, {R0-R3, LR}含义!→ 写回 SP更新栈指针 操作顺序先 SP SP - 4 * 寄存器数量然后依次把 R0,R1,R2,R3,LR 存入栈。 等价压栈保存现场函数入口保存寄存器。7. LDMFDLoad Multiple Full Descending 多寄存器出栈满递减栈LDMFD SP!, {R0-R3, PC}含义 从 SP 指向的栈中取出 R0~R3最后把栈上保存的 LR 值加载进 PC 实现函数返回!自动恢复 SP。 等价出栈恢复现场函数末尾。
RELATED

相关推荐

除了汤不热,这些资源网站同样值得放进收藏夹

除了汤不热,这些资源网站同样值得放进收藏夹

很多人找资源习惯性只上汤不热,用久了发现好东西越来越难淘,更新也不如以前勤快。其实周边还有不少站点各有所长,配合着用效率高得多。找资源别只盯着一个平台,多备几个入口效率更高66分享网(66fxw.com)算是…

📅 2026/9/14 21:43:36
微信 Windows 版多开与消息防撤回工具

微信 Windows 版多开与消息防撤回工具

微信电脑版 Windows 4.1.x 版目前已更新正式版,目前可在官网进行下载。新版本更新日志:在发消息时,支持边写边译为指定的语言;修复一些已知问题。注:4.X 系列版本的防撤回功能基本带撤回提示提醒,可以编辑撤…

📅 2026/9/14 21:43:36
AI辅助科研:赋能科研创新效率升级的新路径与实践探索

AI辅助科研:赋能科研创新效率升级的新路径与实践探索

读研/做科研,最忌讳“囤工具”——下载一堆软件,每款都浅尝辄止,反而浪费时间、拖慢效率。 这篇不贪多,只推荐4款「文献-数据-写作」全流程核心工具,每款都精细化拆解操作步骤、适配场景、避坑细节,甚至补…

📅 2026/9/14 21:43:36
MORE NEWS

更多资讯

📰

Wazuh 5.x SCA 自定义策略迁移指南:从 4.x 格式到 PCRE2 与 YAML 新规范的完整实战

Wazuh 5.x SCA 自定义策略迁移指南:从 4.x 格式到 PCRE2 与 YAML 新规范的完整实战 【免费下载链接】wazuh Wazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads. 项目地址: https://gitcode.com/Git…

📰

Cilium Hubble Relay 节点状态协议解析:relay.proto 中的 NodeStatusEvent 与 NodeState

Cilium Hubble Relay 节点状态协议解析:relay.proto 中的 NodeStatusEvent 与 NodeState 【免费下载链接】cilium eBPF-based Networking, Security, and Observability 项目地址: https://gitcode.com/GitHub_Trending/ci/cilium 导读 本文深入解析 Cilium…

📰

Codex 配 TaoToken:复现 HumanEval 的 pass@k 评估

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

微电网虚拟惯性控制仿真技术与应用实践

1. 微电网虚拟惯性控制仿真概述微电网虚拟惯性控制仿真作为新能源电力系统研究的前沿领域,正在重塑分布式能源的并网方式。传统直流微电网由于缺乏类似交流系统中同步发电机的旋转惯性支撑,在应对新能源功率波动和负荷突变时,电压稳定性面临严…

📰

永磁同步电机转矩分解技术与Maxwell实现

1. 永磁同步电机转矩分解的工程意义 在永磁同步电机(Permanent Magnet Synchronous Motor, PMSM)设计与优化过程中,转矩特性的精确分析直接关系到电机性能评估的准确性。传统方法通常将输出转矩视为整体进行测量或计算,但实际应用…

📰

【uni-app项目实战】心理健康服务平台(三)

目录 三、项目启动 3.1 创建项目 3.1.1 .prettierrc 3.1.2 配置 tabBar 3.1.3 公共样式 3.1.4 引入字体图标与 uni-icons 3.1.5 网站图标 3.2 公共封装 3.2.1 网络请求 3.2.2 轻提示 四、Pinia 状态管理 4.1 安装 4.2 Store 4.3 State 4.4 持久化 五、用户登录…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬