导航

✨学习笔记——从零开始速通汇编(一):寄存器 | JinYu🐟

🎉学习笔记——从零开始速通汇编(二):汇编程序语句结构&寻址方式 | JinYu🐟

🎊学习笔记——从零开始速通汇编(三):数据传送类&算术运算类指令系统 | JinYu🐟

🎃学习笔记——从零开始速通汇编(四):逻辑运算与移位操作类指令系统 | JinYu🐟

🎄学习笔记——从零开始速通汇编(五):程序控制类&串操作类指令系统 | JinYu🐟


学习笔记——从零开始速通汇编(一):寄存器

前言:

笔者所属的专业大一下新开了汇编语言课程,鉴于笔者对计算机的兴趣,特写此系列博客文来记录下汇编语言课程的学习过程及知识点,也可供读者进行学习或者在期末对照此文进行复习或速通

嘻嘻


汇编语言简介:

什么是汇编语言

汇编语言Assembly Language)是一种低级编程语言,它与计算机的机器语言指令几乎一一对应,但使用人类可读的助记符(mnemonics)代替二进制或十六进制操作码

汇编语言的特点

  1. 接近硬件:直接对应处理器指令集
  2. 高效性:可以编写高度优化的代码
  3. 可读性:比机器语言更易于理解和编写
  4. 平台相关:不同CPU架构有不同的汇编语言

汇编语言基本组成

  1. 指令:对应CPU操作(如MOV, ADD, JMP等)
  2. 寄存器:CPU内部的高速存储单元
  3. 内存地址:数据存储位置
  4. 伪指令:汇编器指令,不生成机器码

知识回顾

一个典型CPU是由运算器寄存器控制器等器件组成的,这些器件靠内部的总线相连

寄存器(Register):处理器内部用于暂时存放程序执行过程中的数据和代码的高速存储单元

程序可见寄存器(作为速通,先不讨论程序不可见寄存器)分为通用寄存器专用寄存器(段寄存器)

寄存器

如果是速通,以下了解即可,不用背

通用寄存器 (General-Purpose Registers)

x86架构 (32位) 通用寄存器

  1. EAX (累加器) - 用于算术运算和函数返回值
  2. EBX (基址寄存器) - 常用作内存访问的基址指针
  3. ECX (计数器) - 常用于循环计数
  4. EDX (数据寄存器) - 用于I/O操作和扩展EAX
  5. ESI (源索引) - 字符串/内存操作的源指针
  6. EDI (目的索引) - 字符串/内存操作的目标指针
  7. ESP (栈指针) - 指向栈顶
  8. EBP (基址指针) - 用于栈帧基址

x86-64架构 (64位) 扩展的通用寄存器

  1. RAX, RBX, RCX, RDX (64位扩展)
  2. R8 - R15 (新增的8个64位通用寄存器)

ARM架构通用寄存器

  1. R0-R12 - 通用寄存器
  2. R0-R3 - 常用于函数参数传递
  3. R0 - 常用于函数返回值

专用寄存器 (Special-Purpose Registers)

x86架构专用寄存器

  1. EIP (指令指针) - 存储下一条要执行的指令地址
  2. EFLAGS - 状态标志寄存器,包含各种状态位:
    • CF (进位标志)
    • ZF (零标志)
    • SF (符号标志)
    • OF (溢出标志)
    • PF (奇偶标志)
    • AF (辅助进位标志)
  3. CR0-CR4 (控制寄存器) - 控制CPU操作模式
  4. DR0-DR7 (调试寄存器) - 用于硬件调试
  5. GDTR, LDTR, IDTR, TR (系统表寄存器)

x86-64架构新增专用寄存器

  1. RFLAGS - 64位标志寄存器
  2. RIP - 64位指令指针

ARM架构专用寄存器

  1. CPSR (当前程序状态寄存器) - 类似x86的EFLAGS
  2. SPSR (保存的程序状态寄存器) - 异常模式下保存CPSR
  3. PC (程序计数器) - 类似x86的EIP/RIP
  4. SP (栈指针) - 类似x86的ESP/RSP
  5. LR (链接寄存器) - 存储返回地址

通用寄存器

常见通用寄存器

处理器比较常见的就是8086 CPU

一共有14种

AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

其AX寄存器的逻辑结构如图所示:

寄存器逻辑结构

不光是AX,BX、CX、DX都是这种结构

注意:数据都是以二进制来存放

一个16位寄存器可以存储一个16位的数据

如十进制数18(二进制10010),在寄存器AX中的存储为:

十进制数18

8086寄存器上一代是8位寄存器,所以为了保证原来编写的程序在8086寄存器能正常运行,将每个8086寄存器划分为两个可以独立使用的8位寄存器

高位低位寄存器

如图,0-7为AL(low,低位),8-15为AH(high,高位)

同理:

BX->BH BL

CX->CH CL

DX->DH DL

出于对兼容性的考虑,8086CPU可以一次性处理字节数据和字数据

这里提醒一下

字节(byte):一个字节由8个位( bit)组成,可以存在8位寄存器

字(word):一个字由2个字节组成,两个字节分别称为这个字的高位字节低位字节

其次还有其他类型

双字类型:32位(4个字节),连续占用4个存储单元

四字类型:64位(8个字节),连续占用8个存储单元

十字节类型:80位(十个字节),连续占用10个存储单元

指令:

了解概念

汇编指令是汇编语言的核心组成部分,它们直接对应处理器能够执行的低级操作

基本指令

这里先介绍两个常用的指令:

MOV 把某数送到某地

ADD 把某数加到某地

mov和add指令

了解了基本用法之后,可以看下面表格加深理解

mov和add指令

注意:如果相加后数字超过四位,那么最高位舍去

其他寄存器和段

BP\SI\DI

这三者也是通用寄存器家族的成员,但它们与AX\BX\CX\DX的本质区别在于它们都是不能分解的16位寄存器,可以存放16位的数据

此外,BP可以生成一个存储器地址

SI\DI在某些指令中被指定使用

SP\IP

SP和IP都是16位寄存器

区别:

SP:堆栈指针,存放的是堆栈栈顶指针,内容随着入栈出栈动态改变

IP:指令指针,用来提供下一条执行的指令的地址

FLAGS

FLAGS寄存器为标志寄存器,表示CPU的一个状态

CF(Carry Flag):

进位标志位 加(减)法运算时,若最高位有进(借)位则CF=1;没有进位则CF=0

PF(Parity Flag):

奇偶标志位 运算结果的低8位中“1”的个数为偶数时PF=1;为奇数时PF=0

AF(Auxiliary Carry Flag):

辅助进位标志位 加(减) 操作中,若Bit3向Bit4进位(借位),AF=1;没有进位,AF=0

这个要注意,bit是从0开始数的

ZF(Zero Flag):

零标志位 当运算结果为零时ZF=1;不为零时ZF=0

SF(Sign Flag):

符号标志位 当运算结果是负数时,SF=1;运算结果是正数时,SF=0

OF(Overflow Flag):

溢出标志位 当算术运算的结果超出了有符号数的可表达范围时,OF=1;未超出时,OF=0

例:

条件标志状态分析

段寄存器

存储器的地址分为段地址偏移地址

段寄存器就是来存放段地址

CS:

代码段寄存器 与指令指针构成CS:IP(段地址:偏移地址),一般十六进制表示,实际逻辑地址(物理地址)表示公式:段地址×16+偏移地址

DS:

数据段寄存器

ES:

附加段寄存器

SS:

堆栈段寄存器 与堆栈指针构成SS:SP

段的 划分来自CPU,在编程时可以根据需要将若干连续的内存单元看作一个段,用段地址×16定位段的起始地址,用偏移地址来定位段的内存单元

注意:

  • 一个段的起始地址必须是16的倍数
  • 偏移地址为16位,寻址能力为64KB,即一个段的长度最大为64KB