理解寄存器

 

寄存器的概念

寄存器是CPU内部存储存数据的小型存储区域,本质上是时序逻辑电路,但这种时序逻辑电路只包含存储电路。

寄存器

包括基本程序运行寄存器、控制寄存器、内存管理寄存器、调试寄存器。这里只介绍基本程序运行寄存器。

基本程序运行寄存器

查看源图像

1.数据寄存器

作用:数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

32位cpu有4个通用寄存器分别是EAX,EBX,ECX,EDX。因为对低16位的存储不会影响高16位,这些低16位寄存器可以单独使用,又分别命名为AX,BX,CX,DX。低16位寄存器又可以分为两个8位寄存器,AH,AL,BH,BL,CH,CL,DH,DL。

  •  EAX(针对操作数和结果数据的):EAX寄存器以称为累加器,AX寄存器是算术运算的主要寄存器,可以用于乘、除、输入、输出。输入、输出只使用AL或AX作为数据寄存器。在80386及其以上的微处理器中,EAX寄存器可以用来存储单元的偏移地址。//EAX主要作用为保存函数的返回值
  • EBX(DS段中的数据指针):EBX 是"基地址"(base)寄存器,在内存寻址时存放基地址。
  • ECX(字符串和循环操作的):寄存器ECX称为计数寄存器。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数。
  • EDX(I/O指针): 寄存器EDX称为数据寄存器。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

在32位cpu中,32位寄存器·可以用来对数据或地址进行操作,但在8/16位寄存器中只能对数据进行操作。上述寄存器只要用在算术运算(ADD、SUB、XOR、OR等)指令中。EAX一般用在函数返回值中,所有Win32API函数都会先把返回值保存到EAX再返回。

 2.指针寄存器

作用:主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

  • EBP(SS段中栈内数据指针):扩展机制指针寄存器其内存放一个指针,该指针指向一个栈帧的底部。
  • ESP(SS段中栈指针):栈指针寄存器,指向一个栈帧的顶部

至于BP和SP,是使用在16位cpu当中的指针,与EBP和ESP的作用相同,不多赘述。

EBP和ESP可以用来保存/恢复堆栈。

我的理解:

调用函数时,先将EBP的值入栈,保存当前值,此时栈顶保存的值就是EBP,然后将当前栈顶指针ESP所指的位置赋给EBP,当做一个栈底开辟一个新的栈空间,有变量存入时,ESP指针的位置(从高地址向低地址存入)减小。当函数调用结束,将EBP的位置赋给ESP,也就是函数调用前栈顶的位置,ret返回到函数调用前的位置,pop EBP将当前栈顶位置的值弹出,也就是保存在栈顶,调用之前的EBP的值,此时EBP和ESP都恢复到函数调用之前的值。

  • ESI:(字符串操作源指针)源变址寄存器
  • EDI:(字符串操作目标指针)目的变址寄存器(无太多了解)

3.段寄存器

产生的原因:当时为了解决地址总线(20)与数据总线(16)的宽度不一致,无法在同一个周期进行运算,inter把内存分段,分别用于代码(指令),数据,堆栈和其他,CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位地址左移4位(后面加上4个0)就可以构成20位的段地址,后面四位称为偏移量。

  • CS:存放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP(指令指针)提供。
  • DS:指向数据段的最低地址,也就是数据段的段基地址。偏移量根据具体情况由寻址方式决定。
  • ES、FS、GS:指向附加数据段的段基址。
  • SS:指出当前堆栈的底部地址,即存放堆栈段的段基址。偏移量由SP或BP指针决定。

通常,默认的数据段寄存器是DS;但只有在进行串操作时,默认的段寄存器是ES。

4.指令指针寄存器

作用:用于控制程序中指令的执行顺序。

EIP:32位程序中使用,程序运行时,CPU会读取EIP中一条指令的地址,传送指令到指令缓冲区,EIP寄存器的值自动增加,增加的大小是读取指令的字节大小。

IP:16位程序中使用,与CS段寄存器使用可以寻址到下一条指令的地址。

5.程序状态与控制寄存器

EFLAGS:由原来的16位FLAGS寄存器扩展而来。每一位都有意义,每一位的值或为1或为0,代表On/Off或True/False。目前只需掌握三个标志:ZF(Zero FLag零标志),OF(Overflow Flag)溢出标志、CF(Carry Flag,进位标志)

  • ZF:若运算结果为0,则结果为1(True),否则其值为0(False)
  • OF:有符号整数(signed integer)溢出时,OF值被置为1。
  • CF:无符号整数(unsigned integer)溢出时,其值被置为1。

 

posted @ 2022-04-17 12:03  e1ectronic  阅读(529)  评论(0)    收藏  举报