在此期间,我连续写了10篇CPU基础系列技术故事的文章。 很多读者让我写CPU的寄存器。
寄存器太复杂了,不适合写故事。 拖了很久,终于写完了。 这篇文章详细讲述x86/x64架构的CPU中的复杂寄存器们。
从1946年在冯诺依曼指导下诞生的世界上第一台通用电子计算机ENIAC开始,计算机技术已经发展了70多年。
从当初数学计算专用的巨大东西到后来的大型机服务器时代,个人微机技术蓬勃发展,互联网浪潮席卷了世界,直到移动互联网、云计算日新月异的现在。
在这70多年中,出现了数不清的编程语言,通过这些编程语言开发了无数的应用程序。
无论是什么应用程序,还是什么编程语言,最终的程序逻辑都是交给CPU执行的(当然,这里不仅有CPU,还有协处理器、GPU等)。 因此,理解和学习CPU的原理,对巩固计算机的基础知识有很大帮助。
在70多年的漫长道路中,出现了许多架构的CPU。
MIPS
PowerPC
x86/x64
IA64
ARM
在这里
本文以市场上应用最广泛的x86-x64架构为目标,通过学习其内部100个寄存器功能的作用,串联阐述了CPU的基础工作原理。
本文表明:
CPU指令执行原理
存储器地址技术
软件调试技术的原理
中断和异常处理
系统调用。
CPU多任务技术
什么是寄存器?
寄存器是CPU内部用来存储数据的几个小内存区域,用于暂时存储运算中涉及的数据和运算结果,以及部分CPU动作所需的信息。
x86体系结构CPU走复杂指令集(CISC )路线,提供丰富的指令来实现强大的功能,同时提供许多寄存器来帮助实现功能。 这篇文章涵盖了以下寄存器。
通用寄存器
标志缓存器
指令缓存器
分段缓存器
控制寄存器
除错寄存器
描述符寄存器
任务缓存器
MSR寄存器
通用寄存器
最初打孔的是通用寄存器,这些寄存器最常用程序执行代码,是最基础的寄存器,在程序执行中,大部分时间都是操作这些寄存器来实现指令功能。
通用是指这些寄存器CPU没有特别的用途,被应用程序“随意”使用。 请注意。 这是随便的。 我加了引号。 在一些寄存器中,CPU有一些潜在的规则。 使用时请注意。eax:通常用于执行加法,函数调用的返回值通常也放在这里。
ebx:数据访问

ecx:通常用作for周期等计数器。
当edx:读写I/O端口时,edx用于存储端口号。
esp:堆栈顶部的指针。 指向堆栈的顶部。
ebp:堆栈底部指针指向堆栈底部,通常以ebp偏移的形式定位函数存储在堆栈中的局部变量。
esi:字符串操作时用于存储数据源的地址
对于edi:字符串操作,它经常与esi一起使用以存储目标地址,并执行诸如复制字符串等操作。
在x64架构中,上面的通用寄存器扩展到了64位版本,名称也升级了。 当然,为了支持32位模式的程序,也可以使用上面的名称进行访问。 相当于64位寄存器的低位32位。
在原来的32位时代,函数调用时通用寄存器很少,参数多通过线程的堆栈传递(当然,有名的C this指针通过ecx寄存器传递,但可以使用的寄存器毕竟很少)。
进入x64时代后,寄存器资源变得丰富,参数传递大多通过寄存器进行传递。 寄存器参数的优点是速度快,减少了对内部存储器的读写次数。
当然,具体使用堆栈还是用寄存器传递参数,不是由编程语言决定的,而是由编译器为了生成CPU指令而编译时决定的
标志缓存器
标志寄存器中有很多标志位,记录了CPU执行指令过程中的一系列状态,这些标志大多由CPU自动设定和修正。
CF进位标志
PF奇偶校验标志
ZF零标志
科幻符号标志
OF补全代码溢出标志
TF跟踪标志
IF中断标志
在这里
在x64体系结构中,原始eflags寄存器已升级到64位rflags,但前32位没有添加任何功能,保留供将来使用。
指令缓存器
eip:指令寄存器可以说是CPU中最重要的寄存器。 那是指保存接下来要执行的命令的地址。 CPU的动作实际上是取出该指令执行,同时指令寄存器继续指向下一个指令。 这是CPU工作的基本日常。
另一方面,在漏洞攻击中,黑客希望尽最大努力修改命令寄存器的地址,以执行恶意代码。
同样,在x64架构中,32位eip升级到64位rip寄存器。
文/上海蓝盟 IT外包专家