汇编语言入门教程 - 阮一峰的网络日志

汇编语言入门教程 - 阮一峰的网络日志

汇编语言入门教程 - 阮一峰的网络日志

访问网站
我的收藏186 次访问更新于 a month ago反馈
汇编语言入门教程 - 阮一峰的网络日志 screenshot

详细介绍

汇编语言入门教程 - 阮一峰的网络日志

简介

《汇编语言入门教程》是阮一峰于 2018 年 1 月 21 日发布在个人网络日志上的技术科普文章。文章指出,学习编程通常是从高级语言入手,但计算机实际是通过编译器将高级语言转为二进制代码才能运行,真正能控制硬件的是低级语言。汇编语言作为最底层的低级语言,直接描述和控制 CPU 的运行。由于汇编语言不易学习且简明介绍稀少,作者尝试写一篇“最好懂”的教程,解释 CPU 如何执行代码,帮助读者理解代码的实际运行步骤与硬件行为。

主要内容

文章从基础概念出发,层层递进地介绍了以下内容:

汇编语言是什么

  • CPU 只负责计算,输入二进制操作码(opcode)才能运行。
  • 汇编语言是二进制指令的文本形式,与指令一一对应(如加法指令 00000011 写成 ADD),可被 CPU 直接执行。

来历

  • 从手写二进制指令、纸带打孔到用文字(如 ADD)表达指令,产生汇编与 assembler(汇编器)。
  • 本文介绍最常见的 x86 汇编语言(Intel CPU 使用)。

寄存器与内存模型

  • 寄存器:CPU 自带,用于储存最频繁读写的数据,速度最快,依靠名称区分。早期 x86 有 8 个寄存器(EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP),前七通用,ESP 保存当前 Stack 地址;现代寄存器多为通用。
  • Heap(堆):程序运行时系统分配的内存中,因用户主动请求(如 malloc、新建对象)而从起始地址向高位分配的区域,不会自动消失,须手动或 GC 释放。
  • Stack(栈):函数运行临时占用的内存区域,由结束地址向低位分配,后进先出;函数调用生成帧(入栈 push),结束释放(出栈 pop)。

CPU 指令实例

以 C 程序 example.c(含 add_a_and_bmain 函数)经 gcc -S 生成的汇编为例,逐行讲解:

  • push:将运算子放入 Stack,并调整 ESP。
  • call:调用函数,建立新帧。
  • mov:将值写入寄存器或从 Stack 取数。
  • add:两运算子相加,结果写回第一运算子。
  • pop:取 Stack 最近值写回指定位置,回收空间。
  • ret:终止当前函数,交还运行权给上层。

适用场景

  • 想了解 CPU 实际运行步骤、代码底层执行过程的编程初学者或爱好者。
  • 希望从高级语言进阶理解计算机原理、硬件控制机制的学习者。
  • 作为逆向工程、x86 汇编入门的汉语通俗参考资料。

参考链接

文章末尾列出了参考链接:

  • Introduction to reverse engineering and Assembly, by Youness Alaoui
  • x86 Assembly Guide, by University of Virginia Computer Science