寄存器的工作原理及逻辑功能,寄存器电路工作原理

首页 > 经验 > 作者:YD1662022-11-06 07:33:35

序言

前段时间,我连续写了十来篇CPU底层系列技术故事文章,有不少读者私信我让我写一下CPU的寄存器。

寄存器这个太多太复杂,不适合写故事,拖了很久,总算是写完了,这篇文章就来详细聊聊x86/x64架构的CPU中那些纷繁复杂的寄存器们。

长文预警,时速较快,请系好安全带~起飞~

寄存器的工作原理及逻辑功能,寄存器电路工作原理(1)

自1946年冯·诺伊曼领导下诞生的世界上第一台通用电子计算机ENIAC至今,计算机技术已经发展了七十多载。

从当初专用于数学计算的庞然大物,到后来大型机服务器时代,从个人微机技术蓬勃发展,到互联网浪潮席卷全球,再到移动互联网、云计算日新月异的当下,计算机变的形态各异,无处不在。

这七十多年中,出现了数不清的编程语言,通过这些编程语言,又开发了无数的应用程序。

寄存器的工作原理及逻辑功能,寄存器电路工作原理(2)

可无论什么样的应用程序,什么样的编程语言,最终的程序逻辑都是要交付给CPU去执行实现的(当然这里有些不严谨,除了CPU,还有协处理器、GPU等等)。所以了解和学习CPU的原理都是对计算机基础知识的夯实大有裨益。

在七十多年的漫长历程中,也涌现了不少架构的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位。

rax rbx rcx rdx rsp rbp rsi rdi

除了扩展原来存在的通用寄存器,x64架构还引入了8个新的通用寄存器:

r8-r15

在原来32位时代,函数调用时,那个时候通用寄存器少,参数绝大多数时候是通过线程的栈来进行传递(当然也有使用寄存器传递的,比如著名的C this指针使用ecx寄存器传递,不过能用的寄存器毕竟不多)。

进入x64时代,寄存器资源富裕了,参数传递绝大多数都是用寄存器来传了。寄存器传参的好处是速度快,减少了对内存的读写次数。

当然,具体使用栈还是用寄存器传参数,这个不是编程语言决定的,而是编译器在编译生成CPU指令时决定的,如果编译器非要在x64架构CPU上使用线程栈来传参那也不是不行,这个对高级语言是无感知的。

标志寄存器

标志寄存器,里面有众多标记位,记录了CPU执行指令过程中的一系列状态,这些标志大都由CPU自动设置和修改:

CF 进位标志

PF 奇偶标志

ZF 零标志

SF 符号标志

OF 补码溢出标志

TF 跟踪标志

IF 中断标志

······

寄存器的工作原理及逻辑功能,寄存器电路工作原理(3)

在x64架构下,原来的eflags寄存器升级为64位的rflags,不过其高32位并没有新增什么功能,保留为将来使用。

指令寄存器

eip: 指令寄存器可以说是CPU中最最重要的寄存器了,它指向了下一条要执行的指令所存放的地址,CPU的工作其实就是不断取出它指向的指令,然后执行这条指令,同时指令寄存器继续指向下面一条指令,如此不断重复,这就是CPU工作的基本日常。

而在漏洞攻击中,黑客想尽办法费尽心机都想要修改指令寄存器的地址,从而能够执行恶意代码。

同样的,在x64架构下,32位的eip升级为64位的rip寄存器。

段寄存器

段寄存器与CPU的内存寻址技术紧密相关。

早在16位的8086CPU时代,内存资源宝贵,CPU使用分段式内存寻址技术:

寄存器的工作原理及逻辑功能,寄存器电路工作原理(4)

首页 12345下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.