CPU基础

1. 通用寄存器

32位通用寄存器有8个,分别是EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI。

EBP、ESP主要用来维护堆栈,ESP指向栈顶,EBP指向当前栈帧的起始地址。X86的CPU架构中,栈是向下生长的。当向栈中压入数据时,栈指针的值会减小。

2. 标志寄存器

IA-32CPU 有一个32位的标志寄存器,名为EFLAGS,如下图:

EFLAGS 寄存器包含3类标志:

  1. 用户报告算术指令(如ADD、SUB、MUL、DIV等)结果的状态标志(CF、PF、AF、ZF、SF、OF)。
  2. 控制字符串指令操作方向的控制标志(DF)
  3. 共系统软件执行的管理操作的系统标志。

EFLAGS各个标志位的含义

标志

含义

CF(Carry Flag)

0

进位或借位

PF(Parity Flag)

2

当计算结果的最低字节包含偶数哥1时,该标志为1

AF(Adjust Flag)

4

辅助进位标志,当为3(半个字节)处有进位或借位时该标志为1

ZF(Zero Flag)

6

计算结果为0时,该标志为1,否则为0

SF(Sign Flag)

7

符号标志,结果为负时为1,否则为0

TF(Trap Flag)

8

陷阱标志

IF(Interrupt enable Flag)

9

中断标志,为0时禁止响应可屏蔽中断,为1时打开

OF(Overflow Flag)

11

溢出标志,结果超出机器的表达范围时为1,否则为0

DF(Direction Flag)

10

方向标志,为1时使字符串指令每次操作后递减变址寄存器(ESI和EDI),为0时递增

IOPL(I/O Privilege Level)

12和13

用于表示当前任务(程序)的I/O权限级别

NT(Nested Task flag)

14

任务嵌套标志,为1时表示当前任务是链接到前面执行的任务的,通常是由于中断或异常触发了IDT表中的任务门

RF(Resume Flag)

16

控制处理器对调试异常(#DB)的响应,为1时暂时禁止由于指令断点(是通过调试寄存器设置的指令断点)导致的调试异常

VM(Virtual-8086 Mode flag)

17

为1时启用虚拟8086模式,清除该位返回到普通的保护模式

AC(Alignment Check flag)

18

设置此标志和CR0的AM标志可以启用内存对齐检测

VIF(Virtual Interrupt Flag)

19

与VIP标志一起用于实现奔腾处理器引入的虚拟中断机制

VIP(Virtual Interrupt Pending flag)

20

与VIF标志一起用于实现奔腾处理器引入的虚拟机中断机制

ID(Identification flag)

21

用于检测是否支持CPUID指令,如果能够成功设置和清除该标志,则支持CPUID指令

STC、CLC设置和清除CF位。

STD、CLD设置和清除DF位。

STI、CLI 设置和清除IF位(有权限要求)。

3.控制寄存器

控制寄存器(CR0~CR4)用于控制和确定处理器的操作模式以及当前执行任务的特性。如图:

CR0中含有控制处理器操作模式和状态的系统控制标志;

CR1保留不用;

CR2含有导致页错误的线性地址;

CR3中含有页目录表的基地址(物理地址)以及两个用来控制页目录缓存的标志PCD和PWT

控制寄存器中的标志位,如下表:

标志

含义

PE(Protection Enable)

CR0[0]

为1时启用保护模式,为0时代表实地址模式

MP(Monitor Coprocessor)

CR0[1]

用来控制WAIT/FWAIT指令对TS标志的检查

EM(Emulation)

CR0[2]

为1时表示使用软件模拟浮点单元(EPU)进行浮点运算,为0时表示处理器具有内部的或外部的FPU

TS(Task Switched)

CR0[3]

当CPU在每次切换任务时设置该位,在执行x87 FPU 和MMX/SSE/SSE2/SSE3 指令时检查该位,主要用于支持在任务切换时延迟保存x87 FPU和MMX/SSE/SSE2/SSE3 上下文

ET(Extension Type)

CR0[4]

对于386和486的CPU,为1时表示支持387数学协处理器指令,对于486以后的IA-32 CPU ,该位保留(固定为1)

NE(Numeric Error)

CR0[5]

用来控制x87 FPU错误的报告方式,为1时启用内部的本位(native)机制,为0时启用与DOS兼容的PC方式

WP(Write Protect)

CR0[6]

为1时,禁止内核级别代码写用户级的只读内存页;为0时允许

AM(Alignment Mask)

CR0[18]

为1时启用自动内存对齐检查,为0时禁止

NW(Not Write-through)

CR0[29]

与CD标志共同控制高速缓存有关的选项

CD(Cache Disable)

CR0[30]

与NW标志共同控制高速缓存有关的选项

PG(Paging)

CR0[31]

为1时启用页机制(paging),为0时禁止

PCD(Page-Level Cache Disable)

CR3[4]

控制页目录的缓存方式,为1时启用write-through 方式缓存;为0时启用write-back 方式缓存

VME(Virtual-8086 Mode Extensions)

CR4[0]

为1时启用虚拟8086模式下的中断和异常处理扩展:将中断和异常重定位到8086程序的处理例程以减少调用虚拟8086监视程序(monitor)的开销

PVI(Protected-Mode Virtual Interrupts)

CR4[1]

为1时启用硬件支持的虚拟中断标志(VIF),为0时禁止VIF标志

TSD(Time Stamp Disable)

CR4[2]

为1时只有在0特权级才能使用TDTSC指令,为0时所有特权级都可以使用该指令读取时间戳

DE(Debugging Extensions)

CR4[3]

为1时引用DR4和DR5寄存器将导致无法指令(#UD)异常,为0时引用DR4和DR5等价于引用DR6和DR7

PSE(Page Size Extensions)

CR4[4]

为1时启用4MB内存页,为0时限制内存页为4KB

PAE(Physical Address Extension)

CR4[5]

为1时支持36位或以上的物理内存地址,为0时限定物理地址为32位

MCE(Machine-Check Enable)

CR4[6]

为1时启用机器检查异常,为0时禁止

PGE(Page Global Enable)

CR4[7]

为1时启用P6处理器引入的全局页功能,为0时禁止

PCE(Performance-Monitoring Counter Enable)

CR4[8]

为1时允许所有特权级的代码都可以使用RDPMC指令读取性能计数器,为0时只有在0特权级才能使用RDPMC指令

OSFXSR(Operating System Support for FXSAVE and FXRSTOR instructions)

CR4[9]

操作系统使用,表示操作系统对FXSAVE、FXRSTOR及SSE/SSE2/SSE3指令的支持,以及保证较老的操作系统仍然可以运行在较新的CPU上

OSXMMEXCPT(Operating System Support for Unmasked SIMD Floating-Point Exceptions)

CR4[10]

操作系统使用,表示操作系统对奔腾III处理

器引入的SIMD浮点异常(#XF)的支持。如

果该位为0表示操作系统不支持#XF异常,那

么CPU会通过无效指令异常(#UD)来报告

#XF异常,以防止针对奔腾III以前处理器设计

的操作系统在奔腾III或更新的CPU上运行时

出错

MOV CRn :读写控制寄存器的内容,只有在0特权级才能执行这个命令。

4.其他寄存器

段寄存器:CS、DS、SS、ES、FS、GS。

当CPU工作在实模式下时,其内容代表的时段地址的高16位,即将其乘以16得到该段的基地址。例如,如果ES=2000H, Mov AL,ES:[100H], 2000H*10H+100H=20100H 处的一个字节放入AL寄存器中。

程序指针寄存器EIP(Extended Instruction Pointer),指向CPU要执行的下一条指令。

中断描述符表寄存器IDTR,用于记录中断描述符表(IDT)的基地址和边界(limit)。

全局描述符表寄存器GDTR,用于描述全局描述符表(GDT)的基地址和边界。

局部描述符表(LDT)寄存器LDTR,存放的是局部描述符表的选择子。

任务寄存器TR,用于存放选取任务状态段(Task  State Segment,简称TSS)描述符的选择子。在多任务环境下,CPU在从一个任务切换到另一个任务时,前一个任务的寄存器等状态被保存到TSS中。

调试寄存器DR0~DR7,用于支持调试。

5.64位寄存器

8个新的通用寄存器R8~R15:可以分别使用RnD、RnW、RnL(n= 8~15)来引用这些寄存器的低32位、低16位或低8位。

8个新的SIMD寄存器XMM8~XMM15。

控制寄存器CR8,又称为任务优先级寄存器(Task  PriorityRegister)。

Extended-Feature-Enable  Register(EFER)寄存器:用来启用扩展的CPU功能,其作用与标志寄存器类似。

WinDBG r命令操作的是在中断到调试器时被调试程序保存在内存中的寄存器上下文,而

rdmsr和wrmsr操作的是CPU内部的物理寄存器。

6.MSR寄存器

Model Specific Register,内容为64位。

读取:先将要读的MSR的ID放到ECX中,然后执行RDMSR,返回值被放到EDX(高32位)和EAX(低32位)

写入:先将要写的MSR的ID放到ECX中,再将要写的数据放到EDX和EAX中,最后执行WRMSR

参考:软件调试-硬件基础

软件调试之CPU基础相关推荐

  1. 软件调试第二版卷一硬件基础 pdf_2020全球C++及系统软件技术大会,C++之父领衔...

    2020年是全球IT科技版图震荡和转折之年,系统级软件作为数字世界的核心基础设施,被视为"卡脖子"技术的关键,成为IT产学研"兵家必争之地".C++语言一直被誉 ...

  2. 《软件调试分析技术》学习笔记

    <软件调试分析技术>学习笔记(一) 今天开始写写一些心得体验. <软件调试分析技术>是好友Monster的处女作品.作为一直以的好伙伴,他是我看着长大的,(*^__^*) 嘻嘻 ...

  3. 拍案惊奇——软件调试实战训练营暑期特别班(v2.1)

    随着软件复杂度的不断增加,软件调试的难度越来越大.以调试器为核心的调试技术是征服软件世界的一把利剑.要想成为软件高手,认真修炼软件调试这门剑法是再多也不为过的.本训练营通过12个精选案例让参与者在实战 ...

  4. windows程序员进阶系列:《软件调试》之O--- WinDbg使用介绍

    windows程序员进阶系列:<软件调试>之O--- WinDbg使用介绍 拥有一个顺手的武器是每一个武林高手梦寐以求的.对于windows程序员来说,WinDbg调试器就是我们的武器.熟 ...

  5. 软件调试的艺术笔记:GDB

    很久之前,在https://blog.csdn.net/fengbingchun/article/details/41413381中简单整理过gdb中常用的一些命令,不齐全,这里按照<软件调试的 ...

  6. 图灵2011年6月书讯【误区】【软件调试修炼之道】即将上市

    - 误区:思维中常犯的6个基本错误 --本书通过许多生动玄妙的生活小事,深刻而犀利地揭示了6种思维陷阱,介绍了形成正确信念和作出科学决策应遵循的方法.通过作者引人入胜的叙事方式,层层深入的分析讲解,你 ...

  7. 软件调试学习笔记(七)—— 单步步入单步步过

    软件调试学习笔记(七)-- 单步步入&单步步过 单步步入 设置单步异常 处理单步异常 实验1:单步异常的设置与处理 单步步过 实现思路 实验2:实现单步步过 单步步入 描述: 单步步入的实现依 ...

  8. 软件调试学习笔记(六)—— 硬件断点

    软件调试学习笔记(六)-- 硬件断点 硬件断点 设置硬件断点 触发硬件断点 处理硬件断点 实验:硬件断点的设置与处理 硬件断点 描述: 与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于C ...

  9. 软件调试学习笔记(五)—— 软件断点内存断点

    软件调试学习笔记(五)-- 软件断点&内存断点 调试的本质 软件断点 软件断点的执行流程 分析INT 3执行流程 实验:处理软件断点 内存断点 内存断点的执行流程 实验:处理内存断点 调试的本 ...

最新文章

  1. 垃圾回收器算法之引用计数器法
  2. web前端开发职业技能证书_1+x证书web前端开发职业技能等级标准1
  3. hibernate jpa_JPA /Hibernate刷新策略初学者指南
  4. IBM T410 打开AHCI模式
  5. 【iCore3 双核心板】例程三十五:HTTP_IAP_ARM实验——更新升级STM32
  6. 【华为云技术分享】降本增效的背后:华为云瑶光数字化经营实战
  7. opencv 学习第4课 将鼠标作为笔刷使用
  8. VS2008中 没有QT的代码智能提示
  9. 如果看了此文,你还不懂傅里叶变换,那就过来掐死我吧(完整版)
  10. 每个极客都应该知道的Linux命令
  11. pycharm 2018 永久激活
  12. WPF 加载PDF文件
  13. 移动硬盘无法退出终极解决方法
  14. 计量单位报错:消息号BM305 “未使用语言 ZH 创建单位 XXX”
  15. 关于win10中资源管理器卡顿的问题及解决办法
  16. 2022-2027年中国肺炎疫苗行业市场运行现状及投资战略研究报告
  17. 05 Java 虚拟机.md
  18. Java延时订单处理(上)- - 抛砖引玉
  19. 补充:python实现二叉树里面求叶子节点的算法
  20. 快收藏,2023有这些财务分析模板就够了

热门文章

  1. Docker 安装一些软件命令
  2. 记java开发实习生面试总结
  3. uniapp解决scroll-view回弹抖动等bug
  4. 【前沿技术】AI终于攻陷了数学领域!高数考试超过普通博士??
  5. Verilog 之 rom 存储器 1k容量 32位数据
  6. Win10/Win7离线搭建Qt5.12+MinGW/MSVC2015开发环境
  7. 主机执行大多数命令报错Segmentation fault(中文系统显示段错误)
  8. iOS 高德地图 百度地图 以及苹果自带的地图URI的使用 以及CLLocationManager的使用
  9. 金蝶云星空单据导入导出(可关联源单)使用说明
  10. 用软碟通UltraISO制作windows7安装U盘