汇编语言


汇编语言

CPU简介

CPU的基本组成部件

  • 时钟

    机器指令的最小执行时间就是一个时钟周期

    CPU的主频即为时钟频率,对CPU的整体性能具有直接影响

    • 时钟周期

      时钟频率的倒数,是计算机中最小的时间单位

    • CPU周期

      一条指令执行过程中被划分为若干阶段,每个阶段完成所需时间(需要确认)

    • 指令周期

      是指计算机执行一条指令所需要的时间,通常包括指令取指、指令译码、指令执行和结果写回等几个步骤。

      三者的区别

      CPU周期指的是执行一条指令所需的时间,包括取指周期、指令译码周期、执行周期、访存周期和写回周期。这些周期的长度取决于CPU的设计,不同的CPU可能有不同的周期长度。

      指令周期指的是执行一条指令所需的若干个CPU周期。一条指令可能需要多个CPU周期才能完成,因此指令周期可以看作是CPU周期的集合。

      时钟周期指的是CPU内部时钟的一个周期,通常用来同步CPU内部各个部件的操作。CPU周期和指令周期都是以时钟周期为基础计算的,因此时钟周期可以看作是最基本的计时单位。

      总的来说,CPU周期是指执行指令所需的时间,指令周期是执行一条指令所需的多个CPU周期的集合,而时钟周期是CPU内部时钟的一个周期,用于同步各个部件的操作。

  • 算数逻辑单元

    即ALU

  • 控制单元

    即CU,是CPU的指挥中心

    • 指令寄存器IR
    • 指令译码器ID
    • 指令控制器OC
    • 指令指针寄存器EIP:程序不能直接访问EIP
  • 存储单元

  • 寄存器

    • 八个通用寄存器

      EAX、EBX、ECX、EDX、EDI、ESI、ESP、EBP

    • 一个指令指针寄存器EIP

      EIP始终指向下一条待执行指令的地址

    • 一个CPU状态寄存器EFLAGS

    • 六个段寄存器

  • 总线

    • 地址总线

    • 数据总线

    • 控制总线

寄存器

是中央处理器内部的组成部分,可用来暂存指令、数据和地址

寄存器分类

十六个基本寄存器如下:

  • 通用寄存器(8个)

    32位CPU通用寄存器:EAX、EBX、ECX、EDX、EDI、ESI、ESP、EBP

    可以用于传送和暂存以下数据

    • ==逻辑和算数运算的操作数==
    • 用于地址运算的操作数
    • 内存指针

    EAX:累加寄存器,是操作数和结果数据的累加器

    EBX:基址寄存器,指向DS段中数据的指针

    ECX:计数寄存器,是字符串和循环操作的计数器

    EDX:数据寄存器,I/O指针

    为了实现与16位CPU的向下兼容(即对低十六位数据的存取)

    这些低十六位寄存器分别命名为AXBXCXDX

    对低16位数据的存取,不会影响高16位的数据

    为了兼容8086CPU的上一代CPU中8位寄存器,同样AX、BX、CX、DX这四个16位寄存器又可分为两个独立使用的8位寄存器来用:

    AX可分为AH和AL

    BX可分为BH和BL

    CX可分为CH和CL

    DX可分为DH和DL

    ==AX又可分为高8位的AH寄存器和低8位的AL寄存器,每个寄存器都有自己的名称,可独立存取,程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/双字/字节的信息==

    指针寄存器EBP、ESP和变址寄存器ESI、EDI

    有类似的低16位寄存器BP、SP、SI、DI

    但是它们不可分割成8位寄存器

    ==以上四个寄存器主要用于算数、逻辑运算(ADD\SUB\XOR\OR等)指令中,常用来保存常量与变量的值==

    指针寄存器

    ESP:栈顶指针寄存器,用于存放当前堆栈的栈顶地址,专门用做堆栈指针

    EBP:栈底指针寄存器,表示栈区域的基地址,永远指向当前函数栈的栈底位置

    ==上述两个寄存器,不可以作为一般通用寄存器使用==

    变址寄存器
    ESI:字符串操作源指针,源变址寄存器

    EDI:字符串操作目的指针,目的变址寄存器
    ==ESI和EDI与特定的串操作指令(MOVS/LODS/STOS)一起使用,在字符串操作的时候用的比较多
    变址寄存器存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为通过多种方式访问存储单元提供便利==

  • 一个指令指针寄存器EIP

    EIP始终指向下一条待执行指令的地址

    在16位系统中

    • 保存着CPU下一条将要执行指令的偏移量(offset),这个
      偏移量是相对于目前正在运行的代码段寄存器CS而言的
    • 偏移量加上当前代码段的基地址,就形成了下一条指令
      的地址

    在32位系统中

    • 它的大小为32位,是由原来的16位IP寄存器扩展而来
    • 往往直接保存CPU下一条将要执行指令的地址

    程序运行时,CPU会读取EIP中一条指令的地址,将指令传送到指令缓冲区后,EIP的值自动增加
    CPU每次执行完一条指令,就会通过EIP寄存器读取并执行下一条指令
    不能直接修改EIP的值,只能通过其他指令间接修改

    • 这些特定指令包括JMP、JC、CALL、RET
    • 可以通过中断或异常来修改EIP的值
  • 一个CPU状态寄存器EFLAGS

    主要有3种作用:

    • 用来存储相关指令的某些执行结果
    • 用来为CPU执行相关指令提供行为依据
    • 用来控制CPU的相关工作方式

    在IA-32中标志寄存器的名称为EFLAGS

    • 大小为4个字节, 共有32个位元,每一位都有专门的含义,记录特定的信息,每位的值为1或0,代表
      On/Off或True/False

    • 包含一组状态标志、一个控制标志和一组系统标志

    • 一些标志可以使用专用指令直接修改,但是没有指令可以将整个寄存器进行检查或修改

    EFLAGS寄存器的32位标志可以分为4类:
    – 系统标志(位8,9,14,16,17,18,19,20,21)和
    IOPL(I/O Privilege Level)字段(位12,13)
     控制操作系统或执行操作,应用程序不能修改以上标志位
    – 方向标志(DF,位10):控制串操作指令的处理方向
    DF=0,从低地址到高地址
    DF=1,从高地址到低地址
    – 状态标志(位0,2,4,6,7和11):表示算数指令的运
    算结果,如ADD、SUB、MUL和DIV指令
    和应用程序运行状态密切相关,需掌握
    – 预留标志位(位1,3,5,15,22-31)
    DO NOT USE

  • 六个段寄存器

X86指令集

一条汇编指令的标准格式

汇编代码是由两部分组成:操作码+操作数

  • 操作码在相应的机器指令体系中有相关的表示
  • 根据指令的功能,可以将大部分汇编语句分成如下几类:
    • 数据传送指令
    • 算数运算指令/逻辑运算/移位指令/浮点数运算指令
    • 串操作指令
    • 控制转移指令
    • 处理器控制指令

数据传送指令


文章作者: autumnwt
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 autumnwt !
  目录