【ASM】汇编语言
asm、汇编语言。
汇编语言
编程语言分为:
- 高级编程语言
- C语言。
- C++、Golang等。
- 低级编程语言
- 机器语言
汇编语言
汇编语言(ASM,Assembly Language)是一种与计算机硬件紧密相关的低级编程语言,常用于编写操作系统、驱动程序等性能要求高的软件。
汇编语言,又称符号语言,这个“符号”是相对于机器语言(最底层的语言)而言的。
- 机器语言(二进制代码):
- 计算机CPU能直接理解和执行的唯一语言。
- 它完全由二进制数字
0和1组成的序列构成,这种表示指令的二进制序列被称为机器码。 - 例如,让计算机执行“加法”操作的某条指令,在机器语言中可能看起来像
10000011 11000110(此处仅为示意)。这对人类来说极其晦涩难懂。
- 汇编语言(符号语言):
- 为了克服机器语言的难以记忆和编写的缺点,人们发明了汇编语言。
- 它用人类更容易理解和记忆的符号(助记符) 来替代那些由
0和1组成的二进制指令。 - “符号”主要体现在两个方面:
- 指令助记符:用简短的英文单词缩写来表示指令。
- 例如,用
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的具体实现。 它包含两个层次:
- ISA层:决定了CPU能“理解”哪些指令。 不同的CPU有不同的
指令集架构,比如x86、x86-64、ARM、MIPS等。每种指令集都有自己独特的指令。 如x86架构的MOV、ADD、JMP等;ARM架构的MOV、ADD、B等。 - 微架构层:指在给定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
汇编语言学习资源
- 视频教程:
- 汇编语言模拟器:
- 论坛和社区:
- 开源项目:
- 参考手册:
- 教程网站:
- 在线编译器:
- 书籍推荐:
- 《汇编语言》(王爽 著)
- 《深入理解计算机系统》(CSAPP)
- 《程序员的自我修养:链接、装载与库》(俞甲子 著)