Learning Path
浏览 Assembly 相关教程与章节。
主流编程语言、数据结构、设计模式、正则与基础算法。
教程
24
汇编语言 - 教程 汇编语言(Assembly Language)是一种面向特定硬件的低级语言。 汇编语言用于电子计算机、微处理器或微控制器编程。 汇编语言与机器指令集一一对应,不可跨平台移植。 与 C、Python 等高级语言不同,汇编语言直接操作 寄存器、内存地址 和 CPU 指令,没有任何抽象层的遮挡。 为什么要学汇编 学习汇编语言能让你真正理解计算机的底层工作原理。 以下是学习汇编的几个核心价值: 学习目标说明..
汇编语言 - 寻址方式 寻址方式(Addressing Mode)决定了 CPU 如何定位指令的操作数——数据从哪里来、结果存到哪里去。 什么是寻址方式 每条汇编指令的操作数可以是立即数、寄存器中的值或内存中的数据。 寻址方式 就是告诉 CPU 如何计算操作数的实际地址或直接给出操作数值。 x86 架构提供了多种灵活的寻址方式,理解每种方式的使用场景是写出高效汇编代码的基础。 立即寻址(Immediate Addressi..
汇编语言 - 算术指令 算术指令是 CPU 执行数学运算的基础。本章详细介绍 x86 架构中的加法、减法、乘法、除法以及相关进位运算指令。 ADD - 加法指令 ADD 将源操作数和目标操作数相加,结果存入目标操作数。 实例 [mycode4 type='asm'] ; 文件路径:add_demo.asm ; ADD 指令示例:计算 100 + 200 + 300 section .data ..
汇编语言 - 数组 数组是连续存放的同类型数据集合。在汇编中,数组就是内存中一段连续的空间,通过基址加偏移的方式来访问每个元素。 一维数组定义 实例 [mycode4 type='asm'] ; 数组的定义方式 section .data ; 方式1:逐个列出元素 arr1 dd 10, 20, 30, 40, 50 ; 5 个双字元素的数组 ; 方式2:用 dup 初始化 ..
汇编语言 - 基础语法 本章介绍 NASM 汇编程序的基本结构、语法规则和书写规范,帮助你理解汇编代码的骨架。 汇编程序的基本结构 一个完整的 NASM 汇编程序通常由以下几个部分组成: 实例 [mycode4 type='asm'] ; 文件路径:structure.asm ; NASM 程序基本结构示例 section .data ; 数据段:存放已初始..
汇编语言 - 条件判断 条件判断是程序控制流的基石。汇编语言通过比较指令和条件跳转指令来实现 if-else、switch 等判断逻辑。 CMP - 比较指令 CMP 对两个操作数做减法运算(目标 - 源),但不保存结果,只更新标志位。 本质上 CMP dest, src 等同于 SUB dest, src 但丢弃计算结果。 实例 [mycode4 type='asm'] ; CMP 比较指令示例 s..
汇编语言 - 常量 常量是在编译时确定且程序运行期间不可改变的值。在汇编中使用常量可以让代码更易读、更易维护。 什么是汇编中的常量 在 NASM 中,常量是通过 伪指令 定义的符号,汇编器在编译时将所有常量引用替换为实际值。 与变量不同,常量不占用数据段内存,它们在 编译时 就被替换,相当于 C 语言中的 #define。 EQU - 等值常量 EQU 是最常用的定义常量方式,定义后不可重新定义: 实例 [myco..
汇编语言 - 环境搭建 本章将指导你在 Linux 系统上搭建 NASM 汇编开发环境,并完成你的第一个汇编程序。 Linux 环境准备 如果你使用的是 Windows 系统,建议安装 WSL(Windows Subsystem for Linux) 或使用虚拟机来获得 Linux 环境。 macOS 用户可以在虚拟机中安装 Linux 或使用 Docker 容器。 本教程所有示例基于 Ubuntu/Debian 系统,其他发行..
汇编语言 - 文件管理 文件管理是程序与外部存储交互的基础。通过系统调用,汇编程序可以打开、读取、写入和关闭文件,与高级语言一样灵活地处理文件 IO。 文件操作流程总览 文件操作遵循打开→读写→关闭的基本流程,以及三个标准文件描述符: 文件操作相关的系统调用 系统调用调用号用途主要参数 sys_open5打开/创建文件EBX=文件名, ECX=标志, EDX=权限 sys_read3读取文件EBX=fd, ECX..
汇编语言 - 简介 汇编语言(Assembly Language)是计算机编程语言家族中最贴近硬件的一层,它是人类可读的机器指令助记符表示。 理解汇编语言的本质,是深入学习计算机系统的第一步。 什么是汇编语言 计算机的 CPU 只能理解和执行由 0 和 1 组成的二进制机器码。 例如,在 x86 架构中,机器码 B8 2A 00 00 00 表示将数值 42 移动到 EAX 寄存器。 直接编写二进制机器码对人类来说极其困难且容易..
汇编语言 - 逻辑指令 逻辑指令在汇编编程中用于位级操作,广泛用于掩码运算、位提取、标志位设置和高效乘除运算。 AND - 按位与 AND 对两个操作数逐位执行'与'运算(都为 1 时才为 1)。 实例 [mycode4 type='asm'] ; 文件路径:and_demo.asm ; AND 指令示例 section .text global _start _star..
汇编语言 - 循环结构 循环是程序中最常见的控制结构之一。在汇编语言中,你可以用 LOOP 指令或条件跳转来实现各种循环逻辑。 LOOP 指令 LOOP 是 x86 专门为循环设计的指令,它使用 ECX 作为计数器: 每次执行 LOOP 时,ECX 自动减 1,如果 ECX 不为 0 就跳转到目标标签。 实例 [mycode4 type='asm'] ; 文件路径:loop_basic.asm ; LO..
汇编语言 - 宏 宏(Macro)是 NASM 提供的一种代码复用机制,它允许你在编译时展开代码模板,减少重复编写相似代码的需求。 什么是宏 宏(Macro) 是一种编译时文本替换机制,由汇编器的预处理器在编译前展开。 与过程(Procedure)不同,宏不会有 CALL/RET 开销——每次使用宏时,编译器直接将宏的内容复制到使用位置。 宏不是函数调用,没有栈帧开销;但可执行文件体积会更大,因为每次展开都会复制一份代码。 ..
汇编语言 - 内存管理 内存管理是系统编程的重要部分。在汇编语言中,你可以通过系统调用动态分配和释放内存,直接操作内存地址,实现高效的内存管理。 程序的内存布局 一个运行中的程序在内存中的分布如下: 一个 Linux 进程在内存中的布局如下: 高地址 (0xFFFFFFFF) +----------------------+ | 内核空间 | 用户程序不可访问 +----------------..
汇编语言 - 内存分段 内存分段(Memory Segmentation)是 x86 架构中的一个核心概念,它决定了程序在内存中如何组织代码、数据和栈空间。 为什么需要分段 在 x86 实模式下,CPU 使用 16 位寄存器,但需要访问 1MB 的内存空间(20 位地址)。 16 位寄存器只能表示 64KB 范围(2^16 = 65536),远远不够。 Intel 的解决方案是将内存划分为 段(Segment),每个段有基地址和..
汇编语言 - 数字处理 在汇编语言中处理数字涉及到进制转换、ASCII 转换和算术运算的结合。本章详细讲解如何在程序中输入和输出各种进制的数字。 数字的表示方式 计算机内部所有数字都以二进制存储,但程序中可以用不同进制表示: 进制基数NASM 写法数字范围(32位) 二进制20b10101010 或 10101010b0 和 1 八进制80o52 或 52o0-7 十进制10420-9 十六进制160x2A 或 2Ah0-9..
汇编语言 - 过程(子程序) 过程(Procedure)是汇编语言中实现函数/子程序复用的机制,它能让代码结构化、可重用。理解过程和栈的关系是汇编编程的重要里程碑。 什么是过程 过程 是一段可以被多次调用的代码块,类似于高级语言中的函数(Function)或子程序(Subroutine)。 在汇编中,过程通过 CALL 指令调用,通过 RET 指令返回。CALL 会将返回地址压入栈中,RET 从栈中弹出返回地址并跳转回去。 ..
汇编语言 - 递归 递归(Recursion)是函数调用自身的技术。在汇编中实现递归需要正确管理栈帧,每次调用都有独立的参数和局部变量副本。 递归原理与栈帧 递归的核心在于 每次调用创建新的栈帧,将当前状态保存在栈上。 每次递归调用都会把参数、返回地址和局部变量压入栈中。当递归终止时,栈帧逐层弹出,每层获得其子调用的结果并完成计算。 递归要素说明汇编实现 终止条件防止无限递归条件判断 + je/jg 跳转 递归调用函数调用自..
汇编语言 - 寄存器 寄存器(Register)是 CPU 内部的高速存储单元,是汇编编程中最频繁操作的对象。理解寄存器是学好汇编语言的关键第一步。 什么是寄存器 寄存器是 CPU 芯片内部集成的 超高速小型存储器,用于暂存指令、数据和地址。 与内存不同,寄存器就嵌在 CPU 内部,CPU 访问寄存器几乎零延迟,而访问内存则需要几十到几百个时钟周期。 在汇编语言中,绝大多数运算都是围绕寄存器展开的——数据从内存加载到寄存器,在寄..
汇编语言 - 字符串处理 字符串处理是编程中常见的需求。在汇编中处理字符串意味着直接操作内存中的字节序列,虽然更底层但也更灵活。 字符串的定义和存储 在 NASM 中,字符串本质上是字节序列,可以用 DB 伪指令定义: 实例 [mycode4 type='asm'] ; 字符串定义方式 section .data ; 方式1:标准字符串 str1 db 'Hello, run..
汇编语言 - 系统调用 系统调用(System Call)是用户程序与操作系统内核交互的唯一途径。通过系统调用,汇编程序可以读写文件、分配内存、创建进程等。 什么是系统调用 用户程序运行在受限的 用户态(User Mode),无法直接访问硬件或执行特权操作。 当程序需要执行 IO 操作、内存分配等内核级功能时,必须通过 系统调用 向操作系统内核请求服务。 系统调用的流程是:用户程序发起系统调用 → CPU 切换到内核态 → 内核..
汇编语言 - 变量 变量是程序中存储数据的基本单元。在汇编语言中定义和使用变量比高级语言更接近底层,你需要直接控制变量的大小、类型和内存布局。 汇编中的变量概念 在汇编语言中,变量 本质上是内存中一个有名字的存储位置。 与高级语言不同,汇编变量没有自动的类型检查——一个标签只是内存地址的别名,你可以用任何大小去读写它。 NASM 提供了三种段来存放不同类型的变量:.data(已初始化)、.bss(未初始化)和 .rodata(只..
汇编指令速查表 本文以最常见的 x86 架构汇编语言为对象,将常用指令助记符按功能分类整理,方便学习和快速查阅。 指令助记符在不同汇编器(MASM、NASM、GAS)中基本一致,仅在操作数书写格式上略有差异。 九大类指令概览: 分类 指令数量 主要用途 数据传送指令 15 条 在寄存器、内存、I/O 端口之间搬运数据 算术运算指令 18 条 加减乘除、比较及数制调整 逻辑运算与移位指令 14 条 按位与或非异..