汇编--学习笔记(一)-寄存器(一)

来源:互联网 发布:数据信息安全管理制度 编辑:程序博客网 时间:2024/06/05 11:33

 每个寄存器相当于CPU中的一个存储单元,但它的存取速度比存储器要快得多。它用来存放计算过程中所需要的或所得到的各种信息,包括操作数地址、操作数运算的中间结果等。
 80X86 CPU中的寄存器可以分为通用寄存器、段寄存器和专用寄存器三类,共14个16位的寄存器。
三种寄存器:

  • 段寄存器
    • 代码段寄存器
    • 数据段寄存器
    • 堆栈段寄存器
    • 附加段寄存器
  • 通用寄存器
    • 数据寄存器
    • 指针寄存器
    • 变址寄存器
  • 专用寄存器
    • 堆栈指针寄存器
    • 指令指针寄存器

段寄存器(4个–16位)

 80X86 CPU中有四个专门存放段地址的16位的寄存器,称为段寄存器。每个段寄存器可以确定一个段的起始地址,而这些段则各有各的用途,它们分别是:

名称 全称 中文名称 概述 CS Code Segment 代码段寄存器 存放当前正在运行程序的段地址 DS Data Segment 数据段寄存器 存放当前运行程序所用的数据的段地址 SS Stack Segment 堆栈段寄存器 先进后出 ES Extra Segment 附加段寄存器 附加段是附加的数据段,是一个辅助的数据区,在串操作指令中,用来表示目的串所在数据段的段地址

 除非专门指定,一般情况下,各段在存储器中的分配是由操作系统负责的。每个段可以独立的占用64KB存储区,各段也可以允许重叠,所谓的重叠知识指每个段区的大小允许根据实际来分配,而不一定要占64KB的最大空间,系统允许程序员在必要时可指定所需占用的内存区。

通用寄存器(7个)

 只有AXBXCXDX这四个寄存器可以以字(16位)或字节(8位)的形式访问。

32位 16位 8位(低) 8位(高) 默认段寄存器 全称 概述 EAX AX AL AH DS 累加器 算术运算、I/O指令中存放信息 EBX BX BL BH DS 基地址寄存器 存放内存的偏移地址 ECX CX CL CH 计数寄存器 LOOP指令、移位指令、串操作 EDX DX DL DH 数据寄存器 双字长中高字、I/O指令中端口地址 EBP BP SS 基地址指针寄存器 可作为堆栈区中的一个基地址以便访问堆栈中的信息 ESI SI DS 源变址寄存器 在串指令中表示源数据串的地址 EDI DI DS 目标变址寄存器 在串指令中表示目的数据串的地址

SIDI这两个变址寄存器有自动增量和自动减量的功能,用于变址是非常方便的。

专用寄存器(2个)

32位 16位 默认段寄存器 全称 概述 ESP SP SS 堆栈指针寄存器 它与堆栈段寄存器连用来确定堆栈段中栈顶的地址,SP用来存放栈顶的偏移地址 IP CS 指令指针寄存器 它指向将要执行的下一条指令的首地址,与段寄存器CS连用确定下一条指令的物理地址 FLAGS 标志寄存器 一个存放状态、控制标志的寄存器(它也是十六位的!!)使用了9个位

 当这一地址送到存储器后,控制器可以取得下一条要执行的指令,而控制器一旦取得这条指令就马上修改IP的内容,使它指向下一条指令的首地址。通常它是顺序增加的,从一条指令边界至下一条指令,但是在执行JMP、CALL、RET、IRET、及条件转移等指令时,它可以指向向前或向后若干条指令。
 FLAGS为标志寄存器:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 溢出标志 方向标志 中断允许标志 单步标志 符号标志 零标志 辅助进借位标志 奇偶性标志 进借位标志
  • CF(bit0):进位标志,当运算时,bit5或bit7发生进位(或者说发生进位要求),进位标志就会设定成1.
  • PF(bit2):奇偶标志,当运算结果的低8位里有偶数个1,PF就会被设定为1.
  • AF(bit4):辅助进位标志 ,当进行字节运算时,若低4位向高4位进位(或借位)时,辅助标志就会设定成1.
  • ZF(bit6):零标志,当运算结果等于0时,ZF就会被设定成1.
  • SF(bit7):符号标志,当运算结果的最高位等于1时,SF=1(负号),等于0时,SF=0(正号)。
  • TF(bit8):单步标志,当TF=1时,会使CPU每执行一道命令,就发生INT 01H的中断(通常是在程序出错时,不过除非你要自己写一个出错的程序,否则应该不会用到它).
  • IF(bit9):中断标志,当IF=0时,CPU不允许中断的发生(除了NMI以外).
  • DF(bit10):方向标志,通常配合字符串处理的指令使用.
  • OF(bit11):溢出标志,当运算发生溢出时(运算结果超出了寄存器容量时,发生溢出,需要以有符号数的方法来看),OF设定成1.