汇编语言(Assembly Language)是一种低级别的计算机编程语言,用于与计算机硬件直接交互
,在汇编语言中,程序员使用助记符(mnemonics)来表示机器指令,每个助记符对应于一条特定的机器指令,汇编语言提供了一种更接近机器语言的抽象,但比机器语言更容易理解和编写。
汇编程序执行
编辑(Editing)->汇编(Assembling)->链接(Linking)->加载(Loading)->执行(Execution)->终止(Termination)
编辑(Editing):首先,程序员编写汇编代码,并保存为文本文件,这个过程涉及选择适当的指令、标签、变量等,并且保证语法正确。
汇编(Assembling):汇编器(Assembler)将汇编代码转换成机器语言,也就是将助记符转换为对应的二进制机器指令,汇编器还可能会生成符号表和其他用于调试和链接的信息。
链接(Linking):如果程序包含多个源文件,或者依赖于外部的库文件,链接器(Linker)将这些文件组合在一起,解析符号引用,生成可执行文件;在链接过程中,还会进行地址分配和重定位等操作,以确保程序在内存中正确加载和执行。
加载(Loading):操作系统将可执行文件加载到内存中,并开始执行程序。加载过程涉及将程序代码和数据加载到适当的内存地址,并设置程序的入口点,以便CPU开始执行指令。
执行(Execution):CPU按照程序的指令序列逐条执行指令。在执行过程中,程序可能会读取输入数据、执行算术运算、进行条件分支、修改内存内容等操作,直到程序结束或者遇到终止条件。
终止(Termination):程序执行结束,CPU停止执行指令。在某些情况下,程序可能会通过系统调用或者异常终止,例如遇到错误、完成任务或者收到外部中断。
汇编语言允许程序员直接操作计算机的底层硬件资源,包括处理器、寄存器、内存和输入输出设备等;所以向学好汇编,熟悉计算机的硬件特征是非常重要的。
计算机硬件特征
中央处理器(CPU)
:CPU是计算机的大脑,负责执行程序指令并处理数据,CPU的性能通常由其时钟频率、核心数量、缓存大小等因素决定。
内存(RAM)
:内存用于临时存储程序和数据,以供CPU快速访问,内存的大小决定了计算机能同时处理的数据量和程序规模。
存储设备
:存储设备用于永久性地存储数据,包括硬盘驱动器(HDD)、固态硬盘(SSD)、光盘驱动器等。存储设备的容量决定了计算机可以存储的数据量。
输入设备
:输入设备允许用户将数据和指令输入计算机,包括键盘、鼠标、触摸屏、摄像头等。
输出设备
:输出设备显示计算机处理的数据和结果,包括显示器、打印机、音频设备等。
主板
:主板是计算机各个组件的连接中枢,包括CPU插槽、内存插槽、扩展插槽等。
图形处理器(GPU)
:GPU负责处理图形和图像相关的任务,如图形渲染、视频解码等。
网络接口
:网络接口允许计算机与网络进行通信,包括以太网接口、Wi-Fi适配器等。
电源供应
:电源供应提供电能给计算机各个组件,包括主板、CPU、硬盘等。
处理器
主要的处理器架构
x86_64:x86_64,也称为x64或AMD64,是一种64位的x86架构处理器。它是Intel和AMD等厂商生产的处理器所采用的架构,广泛用于个人电脑、服务器和工作站等系统。x86_64架构保留了传统的x86指令集,并添加了对64位处理和寻址的支持,提供了更大的内存地址空间和更高的性能。流行的操作系统如Windows、Linux和macOS都支持x86_64架构。(本专栏主要分享x86_64架构汇编的内容)
ARM:ARM架构最初是为低功耗、高性能的嵌入式系统设计的。它在移动设备(如智能手机、平板电脑)、嵌入式系统、物联网设备和嵌入式实时操作系统等领域得到广泛应用。ARM处理器以其低功耗、高性能和可扩展性而闻名,其架构设计支持多种处理器核心和配置,从低端微控制器到高端服务器处理器。
MIPS:MIPS是一种经典的RISC(精简指令集计算机)架构,最早由美国斯坦福大学的研究人员开发。MIPS处理器在过去曾经在工作站、路由器、嵌入式系统和嵌入式实时操作系统等领域得到广泛应用。尽管在一些领域的使用逐渐减少,但MIPS仍然在某些特定的应用中有其优势,如高性能嵌入式系统和实时操作系统。
汇编语言与处理器的关系
汇编语言与特定的处理器架构紧密相关,因为不同的处理器架构具有不同的指令集和指令格式。现如今生产处理器的厂商有很多,如Intel Corporation、Advanced Micro Devices (AMD)、ARM Holdings等每个处理器厂商都有自己的指令集架构和汇编语言。 Intel和AMD生产的x86处理器使用相同的指令集架构,因此它们的汇编语言是相同的或者非常类似的;而ARM架构的处理器,由于涉及多个授权厂商和定制设计,其汇编语言可能会有所不同。虽然不同厂商的处理器可能有相似之处,但在细节上仍然存在差异,因此需要使用特定于处理器的汇编语言编写代码以确保最佳性能和兼容性。
寄存器
寄存器(Registers)
:属于处理器的一部分,它们用于执行指令和存储中间结果;寄存器的种类和数量取决于CPU的设计,不同的CPU架构可能具有不同类型和数量的寄存器。
16位处理器的通用寄存器
在许多16位处理器架构中,如x86架构中的16位模式(Real Mode)或8086/8088处理器中,常见的通用寄存器包括:
-
AX 寄存器:累加器寄存器(Accumulator Register),用于执行算术和逻辑运算,存储运算结果。它还可以被拆分为两个8位寄存器:AH(高位字节)和AL(低位字节)。
-
BX 寄存器:基址寄存器(Base Register),通常用于存储内存访问的基地址,或者作为通用寄存器使用。它还可以被拆分为两个8位寄存器:BH(高位字节)和BL(低位字节)。
-
CX 寄存器:计数寄存器(Count Register),通常用于循环计数或者作为通用寄存器使用。它还可以被拆分为两个8位寄存器:CH(高位字节)和CL(低位字节)。
-
DX 寄存器:数据寄存器(Data Register),通常用于存储数据或者作为通用寄存器使用。它还可以被拆分为两个8位寄存器:DH(高位字节)和DL(低位字节)。
-
SI 寄存器:源索引寄存器(Source Index Register),通常用于存储源数据的偏移量,比如在字符串操作中用于指向源数据。
-
DI 寄存器:目的索引寄存器(Destination Index Register),通常用于存储目标数据的偏移量,比如在字符串操作中用于指向目标数据。
-
SP 寄存器:堆栈指针寄存器(Stack Pointer Register),用于存储当前堆栈的栈顶地址,用于堆栈操作。
-
BP 寄存器:基址指针寄存器(Base Pointer Register),通常用于存储堆栈帧的基地址,用于函数调用和访问函数参数和局部变量。
寄存器 | 全称 | 用途 |
---|---|---|
AX | Accumulator | 累加器,用于存储运算结果和一般目的数据 |
BX | Base | 基址寄存器,通常用于存储内存地址 |
CX | Count | 计数寄存器,通常用于循环计数和循环控制 |
DX | Data | 数据寄存器,用于存储数据和一般目的数据 |
SI | Source Index | 源索引寄存器,用于存储源数据的偏移量 |
DI | Destination Index | 目的索引寄存器,用于存储目标数据的偏移量 |
SP | Stack Pointer | 堆栈指针寄存器,用于指向当前堆栈的栈顶地址 |
BP | Base Pointer | 基址指针寄存器,通常用于存储堆栈帧的基地址 |