汇编
文章平均质量分 88
以知识分享为主,介绍汇编世界的种种
Yashar Qian
你好,我是Yashar Qian,一个写了十年代码的“老”程序员。
我的技术地图有点广:以 .NET 为根据地,也曾远征 Java、C++、Python 的江湖,并用 Vue、SQL 和 iOS 开发过不少应用。这些经历让我明白,技术之道,万变不离其宗。
而现在,我选择了一条“向下扎根”的道路——嵌入式开发。我着迷于代码如何直接驱动硬件,享受在资源受限的环境下创造价值的乐趣。这对我而言,是一个全新的起点。
在这里,我将以一个“资深新手”的视角,记录并分享从传统软件到嵌入式世界的转型之路。我的文章会力求通俗易懂,既有硬核的代码分析,也有踩坑填坑的实战记录。期待能与志同道合的你一起学习,共同成长!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ARM标准汇编(armasm)中的“定义”(Assembler Directive)
ARM标准汇编(armasm)中的"定义"指通过特定汇编指令声明程序元素的过程。主要分为五类:1) 数据存储定义(如DCB分配字节、SPACE分配内存);2) 符号定义(如标签、RLIST定义寄存器列表);3) 变量定义(如GBLA声明全局变量);4) 宏定义(MACRO/MEND创建可重用代码);5) 关键控制指令(如AREA定义段、EXPORT声明全局符号)。这些定义指令共同构成了ARM汇编程序的组织框架,对编写结构化代码至关重要。原创 2026-02-18 20:40:43 · 714 阅读 · 0 评论 -
ARM标准汇编(armasm)中的标号(Label)
本文介绍了ARM标准汇编(armasm)中的标号(Label)概念和使用方法。标号作为符号化地址,用于引用代码位置或数据地址。文章详细说明了标号的基本语法规则,包括必须从第一列开始、命名规则和分隔符使用。重点讲解了两种标号类型:命名标号(用于程序入口、分支跳转和数据地址)和数字局部标号(可重复定义,通过后缀b/f指定引用方向)。通过代码示例展示了两种标号的典型应用场景,强调标号在增强代码可读性和简化局部结构编写中的重要作用。原创 2026-02-18 20:23:14 · 442 阅读 · 0 评论 -
ARM汇编语言中的助记符(Mnemonic)是什么?
ARM汇编语言中的助记符(Mnemonic)是代表特定CPU指令的简短英文缩写,用于简化编程。主要分为数据传送(MOV/MVN)、算术运算(ADD/SUB/MUL)、逻辑运算(AND/ORR/EOR)、比较指令(CMP/TST)、跳转指令(B/BL/BX)、内存访问(LDR/STR)等类别。这些助记符直接对应CPU操作,如MOV表示赋值,ADD表示加法,LDR表示内存读取。汇编器会将助记符转换为机器码执行,解决了直接使用二进制编程的困难。助记符结合操作数构成完整指令,如"MOV R0,#42原创 2026-02-18 18:44:06 · 740 阅读 · 0 评论 -
ARM 汇编器中的伪指令(Assembler Directives)
本文介绍了ARM汇编器中的伪指令,包括数据定义、符号定义、段定义、对齐填充、条件汇编、宏定义等主要类别,以及指令集选择、架构指定等特殊伪指令。通过示例展示了伪指令的实际应用,如程序框架构建和数据结构定义,并指出了使用时的注意事项。伪指令虽然不是真正的处理器指令,但对控制汇编过程、组织代码结构具有重要意义。原创 2026-02-02 18:54:56 · 566 阅读 · 0 评论 -
ARM 汇编指令系列文章导读
欢迎来到我的 ARM 汇编指令系列文章!为了帮助大家系统性地学习 ARM 汇编指令,我创建了这个系列教程。本系列旨在从基础到进阶,逐一剖析 ARM 汇编中常用且重要的指令,帮助读者深入理解其原理与应用场景。原创 2026-01-28 21:48:19 · 1024 阅读 · 0 评论 -
ARM 汇编语言语法小解
ARM汇编语言语法解析:本文详细介绍了ARM汇编语言的基本架构特点和语法结构。ARM采用RISC架构,具有加载/存储特点,支持条件执行。文章讲解了指令格式、寄存器分类(通用和特殊寄存器)、指令类型(数据处理、加载/存储、分支等)以及多种寻址方式。同时介绍了条件执行机制、伪指令使用和完整的示例程序。还对比了ARM与Thumb模式的区别,并总结了编程注意事项和常用模式。ARM汇编通过丰富的指令集和条件执行机制,为底层系统编程提供了强大控制能力。原创 2026-01-28 21:38:14 · 1300 阅读 · 0 评论 -
ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)
ARM 汇编中的 LSL(逻辑左移)和 LSR(逻辑右移)是基础移位指令,分别实现二进制位的左移和右移操作。LSL 低位补0,等效于乘以2^n;LSR 高位补0,等效于无符号除以2^n。这两个指令可以单独使用或与其他指令结合(如ADD、MOV等),利用ARM的"桶形移位器"硬件实现高效运算。关键特性包括:移位范围0-31(LSL)或1-32(LSR),可选更新标志位,以及与其他指令结合时的无额外开销优势。LSR与ASR(算术右移)的主要区别在于高位填充方式,分别适用于无符号和有符号数处理原创 2026-01-05 21:22:28 · 1328 阅读 · 0 评论 -
ARM 汇编指令:ROR(循环右移)
ROR是ARM汇编中的循环右移指令,将操作数右移并将移出的位补到左侧。基本语法为ROR Rd, Rm, #imm或ROR Rd, Rm, Rs。该指令支持立即数(1-31)或寄存器指定移位位数,使用S后缀时可更新标志位。典型应用包括位操作(如交换字节顺序)、加密算法和数据重组。与RRX、ASR等其他移位指令不同,ROR能保持所有位信息不丢失,特别适用于密码学、哈希函数和位域操作等场景。移位位数为0时等效于ROR #32。原创 2026-01-05 21:03:00 · 596 阅读 · 0 评论 -
LLVM是什么?
LLVM是一个模块化的开源编译器框架和工具集,最初意为"低级虚拟机",现已演变为项目名称。其核心架构分为前端(如Clang)、中间表示(LLVM IR)和后端三部分,通过统一的IR实现语言与硬件的解耦。LLVM提供丰富的优化器和工具链(如lld、lldb),具有模块化、高性能优化、多语言支持等优势,广泛应用于Swift、Rust等语言编译,以及静态分析、JIT编译等领域。它改变了传统编译器开发模式,成为现代编译器技术的重要基础设施。原创 2026-01-02 20:35:34 · 870 阅读 · 0 评论 -
GCC是什么?
GCC(GNU Compiler Collection)是一个模块化设计的开源编译器系统,采用"前端-中端-后端"架构支持多种编程语言和目标平台。其编译流程包括预处理、中间代码生成(GIMPLE/RTL)、优化和代码生成等阶段,提供向量化、LTO、PGO等高级优化功能。GCC支持交叉编译、插件扩展,并包含丰富的诊断和安全特性,广泛应用于嵌入式开发、高性能计算等领域。作为自由软件运动的重要成果,GCC凭借其强大的优化能力和广泛的硬件支持,在编译器领域保持重要地位。原创 2026-01-01 23:20:19 · 1407 阅读 · 0 评论 -
GCC 和 LLVM 各自的优缺点
GCC与LLVM编译器对比 GCC和LLVM是现代编译技术的两大主流框架。GCC作为历史悠久的编译器,在平台支持广泛性、稳定性和标准兼容性方面表现突出,特别适合嵌入式系统和专有软件开发。而LLVM凭借模块化架构、活跃的开源生态和卓越的工具链集成,成为新语言开发和现代IDE的首选。两者在主流平台的代码生成质量已相当接近,选择取决于具体需求:GCC更适合传统关键系统,LLVM则在新兴技术领域占据优势。这场技术竞争最终推动了整个编译器领域的进步。原创 2026-01-02 21:03:14 · 1349 阅读 · 0 评论 -
ARM 汇编指令:LDM
本文介绍了ARM汇编指令LDM(Load Multiple),用于从连续内存地址一次性加载数据到多个寄存器。文章详细讲解了LDM的基本语法、地址模式(IA/IB/DA/DB)、可选后缀(!和^)以及工作原理,特别说明了寄存器加载顺序与编号有关而与列表顺序无关。重点阐述了LDM与堆栈操作的关系,包括标准指令与堆栈别名的对应关系(PUSH=STMFD,POP=LDMFD)。最后提供了三个经典用例:块数据复制、子程序寄存器保护/恢复以及异常返回。该指令通常与STM配对使用,是ARM汇编中高效处理批量数据的重要指令原创 2025-12-30 19:45:06 · 944 阅读 · 0 评论 -
ARM 汇编指令:STM
本文介绍了ARM汇编指令STM(Store Multiple)的功能和用法。STM用于将多个寄存器的值存入连续内存地址,是LDM的逆操作。文章详细解析了指令语法,包括寻址模式(IA/IB/DA/DB)、寄存器列表、写回选项和特权模式选项。通过示例展示了基本存储、栈操作和批量数据保存等典型应用场景,并说明了与栈操作的关系(等效PUSH/POP)。最后总结了STM的重要特性:固定存储顺序、连续内存访问、原子性注意事项和执行效率优势,以及在实际编程中的主要应用场景,如函数调用、任务切换和中断处理等。原创 2025-12-30 19:32:16 · 1172 阅读 · 0 评论 -
ARM 汇编指令:UBFX
本文介绍了 ARM 汇编指令 UBFX(无符号位域提取),其功能是从源寄存器提取指定位域并零扩展存入目标寄存器。指令格式为 UBFX <Rd>, <Rn>, #<lsb>, #<width>,其中 lsb 指定起始位,width 指定提取位数。该指令比移位和掩码操作更高效,适用于数据结构字段提取和硬件寄存器操作,支持 ARMv6T2 及以上架构。示例展示了如何提取数据中的特定字段,并对比了与 SBFX 指令的区别。原创 2025-12-25 21:28:16 · 381 阅读 · 0 评论 -
ARM 汇编指令:STP 和 LDP
ARMv8-A架构中的STP/LDP指令是一对高效的内存操作指令,用于同时存储/加载两个寄存器。STP(Store Pair)将两个寄存器值存入相邻内存地址,LDP(Load Pair)则进行相反操作。这对指令通过单条指令完成两次内存访问,比单独使用STR/LDR更高效。主要用途包括函数调用时的栈操作(保存/恢复寄存器)、大数据块移动以及结构体/数组元素存取。指令支持三种寻址模式:偏移模式(不修改基址)、前变基模式(先修改基址)和后变基模式(后修改基址),其中后两种模式特别适合栈操作。使用时需注意地址对齐要原创 2025-12-25 21:18:58 · 800 阅读 · 0 评论 -
ARM 汇编指令:PUSH 和 POP
本文介绍了ARM汇编中的PUSH和POP指令,它们是用于栈操作的指令。PUSH用于将寄存器值压入栈(等价于STMDB),而POP用于从栈中恢复寄存器值(等价于LDMIA)。文章详细说明了这两种指令的语法、功能和使用场景,包括在子程序调用时保存和恢复现场的应用。此外,还指出了寄存器顺序、栈对齐要求等注意事项,并与x86架构的栈操作进行了简要对比。文章最后给出了一个完整的函数调用与返回示例,帮助理解这些指令的实际应用。原创 2025-12-24 21:37:06 · 1317 阅读 · 0 评论 -
ARM 汇编指令:ERET
本文详细介绍了ARM架构中的特权指令ERET(Exception Return),该指令用于从异常或中断处理程序返回。ERET会原子性地执行两个关键操作:从ELR_ELx恢复PC(返回地址)和从SPSR_ELx恢复处理器状态(包括标志位、中断使能、执行状态等)。作为特权指令,ERET只能在EL1及以上级别执行,是操作系统实现异常处理和特权级别切换的基础机制。与普通RET指令不同,ERET会完整恢复处理器上下文,支持执行状态和异常级别的切换。文章还提供了AArch64中断处理流程示例,并解释了相关系统寄存器的原创 2025-12-24 21:23:56 · 612 阅读 · 0 评论 -
ARM 汇编指令:BX
BX 指令是 ARM 架构中实现分支跳转和指令集状态切换的关键指令。它通过目标地址最低有效位(LSB)决定跳转后进入ARM状态(LSB=0)还是Thumb状态(LSB=1),并自动对齐地址。主要用途包括:子程序返回(BX LR)、ARM/Thumb状态切换、以及函数指针调用。与BLX、B等指令相比,BX不保存返回地址但支持状态切换。该指令体现了ARM架构的灵活性,是实现混合编程和高效控制流管理的重要工具。原创 2025-12-23 22:30:57 · 1432 阅读 · 0 评论 -
ARM 汇编跳转指令:B(Branch)详解
本文深入解析ARM汇编中的B跳转指令家族,包括无条件跳转B指令和条件跳转B{cond}指令。B指令实现±32MB范围内的相对跳转,不保存返回地址;条件跳转通过CPSR标志位判断执行条件。文章详细介绍了B.LT等条件跳转的使用场景、标志位检查逻辑,以及有符号/无符号比较的区别。同时提供了跳转范围限制的解决方案和条件执行优化方法,是理解ARM程序流程控制的重要参考资料。原创 2025-12-23 22:04:41 · 423 阅读 · 0 评论 -
ARM 汇编指令:TST
本文介绍了ARM汇编中的TST测试指令。TST执行按位与操作但不保存结果,仅更新条件标志位(N、Z),常用于位测试和条件判断。其语法为TST{cond} Rn, Operand2,通过示例展示了检查寄存器零值、特定位状态、2的幂以及内存对齐等典型应用场景。与AND和CMP指令相比,TST不保存结果但更高效,特别适合作为条件分支的前置测试。文章还解析了相关数学原理,如2的幂的二进制特性和地址对齐判断方法。原创 2025-12-22 21:41:45 · 1318 阅读 · 0 评论 -
ARM 汇编指令:BEQ
本文介绍了ARM汇编中的BEQ指令(相等时跳转)。BEQ根据CPSR中的Z标志位进行条件跳转,当Z=1(前一条指令结果为0)时跳转到指定标签。文章详细讲解了BEQ的语法格式、工作原理、典型应用场景(如条件判断、循环控制)以及与BNE的区别。通过多个代码示例展示了BEQ与CMP/SUBS指令的配合使用,并阐述了其底层标志位设置原理。最后指出BEQ是ARM条件执行体系的重要组成部分,能实现高效的条件分支逻辑。原创 2025-12-22 21:39:23 · 666 阅读 · 0 评论 -
ARM 汇编指令:MOV
本文介绍了ARM架构中的MOV指令,它是数据传送的基础指令,功能类似于高级语言的赋值操作。MOV支持将寄存器值、立即数或移位后的值传送到目标寄存器,并具有条件执行和更新标志位的功能。文章对比了MOV与LDR指令的区别,提供了具体实例,并说明了32位与64位ARM架构中MOV指令的差异。MOV指令凭借其高效性和灵活性,成为ARM汇编编程的重要基础。原创 2025-12-18 20:07:47 · 852 阅读 · 0 评论 -
ARM 汇编指令:STR
STR是ARM汇编中的存储寄存器指令,用于将寄存器值写入内存。基本语法为STR{size} Rt, [Rn, operand2],支持字节(B)、半字(H)和字操作。主要寻址模式包括:偏移模式(基址不变)、前变址(先计算地址并更新基址)和后变址(先存储后更新基址)。在ARMv8 64位架构中,寄存器名变为X/W前缀,数据大小通常由寄存器宽度隐含。STR与LDR指令配合使用,是ARM汇编内存操作的基础,常用于变量赋值、函数调用保存寄存器等场景。原创 2025-12-17 22:09:52 · 722 阅读 · 0 评论 -
ARM 汇编指令:ORR
ARM 汇编指令 ORRS 执行按位逻辑或运算并更新条件标志位。其格式为 ORRS Rd, Rn, Operand2,将操作数按位或后存入目标寄存器,并设置N(符号)、Z(零值)和C(进位)标志位。与普通ORR的区别在于会更新标志位,适用于需要条件判断的场景,如位测试或状态检查。在Thumb-2中支持宽指令,早期Thumb模式限制寄存器范围。典型用途包括置位特定位、组合位测试等,若无需标志更新可使用ORR,纯测试建议用TST指令。原创 2025-12-17 21:42:07 · 397 阅读 · 0 评论 -
ARM 汇编指令:MRS 和 MSR
在ARM嵌入式开发中,MRS和MSR是核心汇编指令,用于系统寄存器与通用寄存器间的数据传输。MRS读取系统寄存器(如PSR、CONTROL)到通用寄存器,用于获取CPU状态;MSR将通用寄存器值写入系统寄存器,用于配置CPU行为。这对指令在中断管理、RTOS上下文切换和模式切换中至关重要,是底层硬件控制的基础。开发者可通过内联汇编或CMSIS函数调用这些指令,实现精确的处理器控制和状态管理。原创 2025-12-01 22:44:29 · 2002 阅读 · 0 评论 -
ARM 汇编指令:LDR
LDR是ARM汇编中的加载指令,用于将内存数据读取到寄存器,类似C语言的指针解引用。其基本语法为LDR{条件}{大小} 目标寄存器, 源内存地址,支持固定地址、寄存器地址及带偏移量的寻址方式。常见变体包括LDRH(半字)、LDRB(字节)等不同数据大小的加载。伪指令LDR =用于加载地址或立即数,而[Rn]形式才是真正的内存读取。LDR与STR指令配对使用,分别实现内存读写,是访问变量、外设寄存器和数据结构的基础操作。核心功能可概括为"从内存搬数据到寄存器"。原创 2025-12-15 21:15:51 · 1199 阅读 · 0 评论
分享