汇编语言
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的向下兼容(即对低十六位数据的存取)
这些低十六位寄存器分别命名为AX、BX、CX、DX
对低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下一条将要执行指令的偏移量(offset),这个
一个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指令集
一条汇编指令的标准格式
汇编代码是由两部分组成:操作码+操作数
- 操作码在相应的机器指令体系中有相关的表示
- 根据指令的功能,可以将大部分汇编语句分成如下几类:
- 数据传送指令
- 算数运算指令/逻辑运算/移位指令/浮点数运算指令
- 串操作指令
- 控制转移指令
- 处理器控制指令