文章

文章列表

ASM

【ASM】汇编语言

asm、汇编语言。

【ASM】汇编语言

汇编语言

编程语言分为:

  • 高级编程语言
    • C语言。
    • C++、Golang等。
  • 低级编程语言
    • 机器语言
    • 汇编语言

汇编语言(ASM,Assembly Language)是一种与计算机硬件紧密相关的低级编程语言,常用于编写操作系统、驱动程序等性能要求高的软件。

汇编语言,又称符号语言,这个“符号”是相对于机器语言(最底层的语言)而言的。

  1. 机器语言(二进制代码):
    • 计算机CPU能直接理解和执行的唯一语言。
    • 它完全由二进制数字 01 组成的序列构成,这种表示指令的二进制序列被称为机器码
    • 例如,让计算机执行“加法”操作的某条指令,在机器语言中可能看起来像 10000011 11000110(此处仅为示意)。这对人类来说极其晦涩难懂。
  2. 汇编语言(符号语言):
    • 为了克服机器语言的难以记忆和编写的缺点,人们发明了汇编语言。
    • 它用人类更容易理解和记忆的符号(助记符) 来替代那些由 01 组成的二进制指令
    • “符号”主要体现在两个方面:
      • 指令助记符:用简短的英文单词缩写来表示指令。
        • 例如,用 MOV(Move的缩写) 表示“数据传送”,用 ADD 表示“加法”,用 JMP(Jump的缩写) 表示“跳转”。
        • 在x86架构中,上面那条机器码 10000011 11000110 对应的汇编指令可能就是 ADD SI, 02(这只是一个示例,具体格式因处理器架构而异),意思是把2加到SI寄存器上。这显然易懂得多。
        • 注意:不同指令集架构下,相同助记符可能对应不同的机器码。
      • 符号地址:用有意义的标签(Label)来代表内存地址。
        • 在程序中跳转到某个地址时,不需要计算和记住具体的二进制地址,只需要用一个标签,比如 loop_start:error_handler:汇编器在翻译时会自动计算出正确的地址。

符号语言 这个称呼深刻地揭示了汇编语言的本质:它是机器语言的一种人类可读的符号化表示。它是介于人类思维和机器硬件之间的一座桥梁,虽然比高级语言(如C++, Python)要低级和复杂,但比直接面对二进制的机器语言要友好得多。

尽管汇编语言相比机器语言更易读,但它仍然与特定处理器架构紧密绑定,可移植性差,且编写复杂程序时代码量较大。

运行汇编代码

汇编语言 与 机器语言 的核心关系与过程。

汇编语言 $\stackrel{依靠}{\xrightarrow{}}$ 汇编器 $\stackrel{翻译成}{\xrightarrow{\hspace{2em}}}$ 机器语言

  • 程序员:使用汇编语言(符号语言)编写源代码。
  • 汇编器:一个专门的翻译程序,它的任务就是读取asm(汇编)源代码中的那些“符号”,然后将它们一对一地翻译成对应的二进制机器码
  • 计算机:最终执行由汇编器生成的机器码。

指令集、CPU架构、ASM、硬编码

指令集架构(Instruction Set Architecture,ISA),又称指令集指令集体系,是计算机硬件与软件之间的接口规范ISA作为计算机系统中软硬件交互的核心界面, 定义了处理器可执行指令的集合、寄存器组织结构、内存访问方式以及中断处理机制等基础硬件特性。 其包含复杂指令集(CISC)与精简指令集(RISC)两大技术路径。

  • CISC
    • 全称:复杂指令集计算机(Complex Instruction Set Computer)
    • 简称:复杂指令集(CISC)
    • 特点:指令格式复杂、长度可变。单条指令功能强大,常可融合内存访问与算术运算。
    • 常见的CISC架构 / 典型代表:x86、x86-64(即x64或amd64)等。
  • RISC
    • 全称:精简指令集计算机(Reduced Instruction Set Computer)
    • 简称:精简指令集(RISC)
    • 特点:指令格式规整、长度固定(如32位)。指令功能简单,强调通过多条指令的组合完成复杂操作,易于流水线设计。
    • 常见的RISC架构 / 典型代表:ARM(AArch32、AArch64)、RISC-V、MIPS等。

CPU架构ISA的具体实现。 它包含两个层次:

  1. ISA层:决定了CPU能“理解”哪些指令。 不同的CPU有不同的指令集架构,比如x86、x86-64、ARM、MIPS等。每种指令集都有自己独特的指令。 如x86架构的MOVADDJMP等;ARM架构的MOVADDB等。
  2. 微架构层:指在给定ISA下,如何设计硬件来高效地执行这些指令(如Intel的Haswell、AMD的Zen都是x86-64 ISA的不同微架构)。

汇编语言(ASM)是机器指令(机器码)的符号化表示。其核心助记符(如MOV)由ISA规范定义,由CPU厂商在指令集文档中定义。

汇编器的任务是将汇编源代码(包含助记符、操作数及汇编器特定语法)翻译成对应ISA(如x86、ARM等)的机器码

硬编码(或称机器码、二进制码、二进制指令)是指令对应的机器语言二进制码,是CPU能够直接解码和执行的二进制指令编码。它没有任何中间抽象层,是计算机硬件执行的最底层代码。 这些二进制指令是CPU硬件直接执行的底层代码。例如:

  • MOV RAX, 0x123 指令(在x86-64 ISA中)对应的机器码可能为 48 B8 23 01 00 00 00 00 00 00
  • MOV X0, #5 指令(在ARM AArch64 ISA中)对应的机器码可能为 D2 80 00 A0

注意:

  • 对于同一个CPU(同一个CPU架构、同一种ISA),干同一件事情,汇编风格随便,生成的机器码都一样(是固定的)。
  • 在同一个ISA下,机器指令与机器码的映射是固定的;但汇编语言到机器指令的映射,为实现同一功能留出了选择空间。

汇编与反汇编:

  • 汇编:汇编代码 $\Rightarrow$ 机器码
  • 反汇编:机器码 $\rightarrow$ 汇编代码

MASM NASM ATT ARM

汇编语言学习资源

本文由作者按照 CC BY 4.0 进行授权