前置知识

  • x86泛指一系列基于Intel 8086且向后兼容的中央处理器指令集架构。最早的8086处理器于1978年由Intel推出,为16位微处理器。
  • 80X86 包括Intel 8086801868028680386以及80486
  • 内存的分段和分页机制(参考《Linux内核完全剖析》)

80X86寄存器

关于什么是寄存器

以下基于80386 来说明

80386包含了16个寄存器,并分为以下几种类型:

  1. 通用寄存器。包含八个多用途的寄存器,通常进行算数和逻辑运算
  2. 段寄存器。包含六个寄存器,用来进行内存寻址
  3. 状态和指令寄存器。用于记录和改变当前处理器状态

如下图所示:

寄存器结构

通用寄存器

General Registers

通用寄存器是用的最多的,可以分解为16和8bit寄存器(8086就是16位的寄存器)

32 bits : EAX EBX ECX EDX

16 bits : AX BX CX DX

8 bits : AH AL BH BL CH CL DH DL

H 后缀表示高位,L后缀表示低位

数据寄存器

累加器

( A ,Accumulator)

被称为加法寄存器,通常进行I/O端口访问,算数运算,中断 ,etc...

DIV除法上的应用:

  • 除数8位

    • 被除数一定是16位的, 被除数默认放在AX寄存器中
    • 保存结果,AL保存商,AH保存余数
  • 除数16位
    • 被除数一定是32位的,AX放不下,使用另外一个16位寄存器DX,DX存放高位,AX存放低位
    • 保存结果,AX保存商,DX保存余数

MUL乘法上的应用:

  • 两个数都是8位

    • 一个放在AL中
    • 另外一个则位于其他的寄存器或者说是内存单元中
    • 结果:两个八位相乘是16位,将结果保存在AX中
  • 两个数都是16位
    • 一个放在AX中
    • 另一位位于16位的寄存器中或者某个内存字单元中
    • 结果:两个16位相乘是32位,将结果高16位保存在DX中,低16位保存在AX中

基址

(B , Base)

基地址寄存器,用于内存访问

除了暂存一般性数据的功能外,BX 作为通用寄存器的一种,BX 主要还是用于其专属功能 – 寻址(寻址物理内存地址)上

BX寄存器一般存放的是偏移地址(offset)。

计数器

(C , Counter)

计数寄存器,当在汇编指令中使用循环 LOOP 指令时,可以通过 CX 来指定需要循环的次数

而 CPU 在每一次执行 LOOP 指令的时候,都会做两件事:

一件就是令 CX = CX – 1,即令 CX 计数器自动减去 1;

还有一件就是判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,而继续执行循环下面的指令,

当然如果 CX 中的值不为 0 ,则会继续执行循环中所指定的指令

数据

(D,Data)

数据寄存器,可以暂存一般性的数据,和加法寄存器使用方法类似

功能和上述AX描述的一样

指针寄存器(BP,SP)

BP

BP不能分割成2个独立的8位寄存器使用

主要适用于给出堆栈中数据区的偏移,从而可以方便的实现直接存取栈中的数据

以[...]的方式访问内存单元:

  • [BP] ,没有明确或者说是显示的给出段地址时,

    • 默认使用SS寄存器中的值(BX,SI,DI默认使用DS段寄存器)
  • DS:[BP] ,明确指出段地址
    • 段地址位DS,偏移量为BP
MOV BP,0
MOV AX,[BP] ;将 SS:[BP] 代表的内存单元移入 AX 中
MOV AX,CS:[BP] ;将 CS:[BP] 代表的内存单元移入 AX 中

SP

SP 必须和SS段寄存器一起使用,格式如下:

SS:SP

变址寄存器(SI,DI)

首先,变址寄存器和上面介绍的指针寄存器(也就是 BP 和 SP),它们的功能其实都是用于存放某个存储单元地址的偏移,

或者是用于某组存储单元开始地址的偏移,即作为存储器指针使用

段寄存器

在编程中,可以将内存段定义为一下几个类型的段:

  • 数据段(DS,ES,FS,GS)

    用来存放数据的段
  • 代码段(CS,Code Segment)

    存放代码(指令)
  • 栈段(SS,Stack Segment)

    进行函数调用

CS

CS 用来表示当前正在处理的代码段,此时EIP/IP 中包含了当前代码段内下一条要执行指令的段内偏移地址。

所以,要执行指令的地址可表示成 CS:[EIP] 这就是常见的CS:IP 的由来

SS

表示当前堆栈段使用SS ,栈顶部有ESP寄存器指定。因此堆栈的地址为 SS:[ESP]。

如果没有指定所操作的数据段时,那么DS则是默认的数据段寄存器

标志寄存器(Flags)

标志寄存器用来控制一些特定的操作和指示80X86的状态

低16 bits可以用来适配8086和80286,因为低16 bits和它们的flags相同

可以将标志分为三个类别

状态标志

EFLAGS寄存器中的状态标志允许一个指令的结果去影响后一个指令的结果

算数指令使用:OF, SF, ZF, AF, PF CF

扫描字符串,字符串比较,循环指令使用 ZF 来表示执行完成

执行算数指令之前使用CF 设置,清理和补充

控制标志

EFLAGS寄存器中的控制标志DF 控制字符串指令

DF 会导致字符串指令自增,使得字符串从高地址到低地址

系统标志

具有五个标志,系统标志控制着 I/o ,可屏蔽中断,调试,任务切换,在保护模式开启8086虚拟执行,多任务环境

系统级寄存器

用来支持系统的功能:

  • 内存管理
  • 保护
  • 多进程/多任务
  • I/O
  • 中断和异常处理
  • 初始化
  • 多进程协同处理
  • 调试

内存管理寄存器

包含了四个寄存器,这些寄存器都是段基址寄存器,这些段中含有分段机制的重要信息表

GDTR

全局描述符表寄存器(global descriptor table register),存放着GDT的32位线性基地址和16位表长度值。

IDTR

中断描述符表寄存器(interrupt descriptor table register)存放中断描述符表IDT32位线性基地址和16位表长度值

LDTR

局部描述符表寄存器(Local descriptor table register) 存放中断描述符表LDT 32位线性基地址和16位表长度值

TR

任务寄存器(task register)存放当前任务TSS段的16位选择符、32位及地址、16位段长度和描述符属性值。它应用GDT表中的一个TSS类型的描述符

控制寄存器

控制寄存器(CR0、CR1、CR2和CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性

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

    用于控制80X86浮点协处理器的操作(协/辅助处理器,用来协助/辅助中央处理器完成其无法执行或执行效率低下的处理工作)

    • ET ( Extension Type) 扩展类型
    • TS (Task Switched)任务已切换标志
    • EM (EMulation)仿真标志
    • MP (Monitor Coprocessor 或Math Present)监控协处理器标志

      保护控制位
    • PE (Protection Enable)启用保护标志
    • PG (Paging)分页标志
    • WP(Write Proctect)写保护标志
    • NE(Numeric Error)协处理器错误标志
  • CR1 保留不用
  • CR2 含有导致页错误的线性地址
    • 用于出现页异常时报告出错信息。当出现异常,处理器就会把引起异常的线性地址存放在CR2中。只需要检查CR2的内容来确定线性空间中哪一个页面引发了异常
  • CR3 中含有也目录表物理内存基地址(用于内存分页机制),也被称为页目录基地址寄存器PDBR(Page-Directory Base Address Register)
  • CR2 和 CR3 用于分页机制

参考

汇编语言(第4版)

x86汇编语言

INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986

Linux 内核完全剖析基于0.11 内核

X86寄存器的更多相关文章

  1. x86寄存器总结

    X86寄存器 ·x86寄存器分类: 8个通用寄存器:EAX.EBX.ECX.EDX.ESI.EDI.ESP.EBP 1个标志寄存器:EFLAGS 6个段寄存器:CS.DS.ES.FS.GS.SS 5个 ...

  2. X86寄存器全称

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  3. 开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比

    ARM32体系中有31或33个通用寄存器,没有特定的某种态下有r0-r15一共16个寄存器,快速中断态下有另一组r8-r12备份寄存器,在用户态和系统态之外其它态下都各自有一组r13-r14备份寄存器 ...

  4. The Art of Picking Intel Registers Intel寄存器的艺术

    https://www.swansontec.com/sregisters.html I wrote this article for an online magazine called Scene ...

  5. 反调试——11——检测TF标志寄存器

    反调试--11--检测TF标志寄存器 在intel的x86寄存器中有一种叫标志寄存器: 标志寄存器中的TF(Trap Flag)位,CPU在执行完一条指令后,如果检测到标志寄存器的TF位为1,则会产生 ...

  6. [汇编与C语言关系]5. volatile限定符

    现在研究一下编译器优化会对生成的指令产生什么影响,在此基础上介绍C语言的volatile限定符.首先看下面的C程序: /* artificial device registers */ unsigne ...

  7. Intel系列CPU的流水线技术的发展

    Intel系列CPU的流水线技术的发展 CPU(Central processing Unit),又称“微处理器(Microprocessor)”,是现代计算机的核心部件.对于PC而言,CPU的规格与 ...

  8. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  9. VC++代码的汇编分析(一)

    VC++代码是最接近汇编指令的高级语言,为了更加准确和深刻理解VC++编码中所涉及的很多技术概念和编译器参数的含义,从汇编指令层面进行剖析和解读,有助于开发者更加准确.直观.深刻理解高级语言中很多概念 ...

随机推荐

  1. Windows MongoDB 安装 和 常规操作

    一.下载&安装 从官网 https://www.mongodb.com/try/download/community 下载,可以根据情况选择响应版本.本文演示版本为 5.0.7 下载 .msi ...

  2. php错误异常及其排错

    错误和异常 错误 php程序自身的问题,一般是由非法的语法,环境问题导致 异常 一般是业务逻辑上出现的不合预期.与正常流程不同的状况,不是语法错误 错误异常继承关系 小括号表示php版本 php7下的 ...

  3. vmware安装或卸载时,显示无法打开注册表项

    ​ vmware卸载是出了名的臭名昭著,因为太难删干净了,删不干净又会有各种各样的问题.比如下文这个"无法打开注册表项" 这个我相信有很多人在重装vmware的时候遇到过,因此我来 ...

  4. goland设置import规范

    import 规范 引入了三种类型的包,标准库包,第三方包,程序内部包,建议采用如下方式进行组织你的包: 有顺序的引入包,不同的类型采用空格分离, 第一种标准库 第二是第三方包 第三是项目包. 在项目 ...

  5. 使用本地自签名证书为 React 项目启用 https 支持

    简介 现在是大前端的时代,我们在本地开发 React 项目非常方便.这不是本文的重点,今天要分享一个话题是,如何为这些本地的项目,添加 https 的支持.为什么要考虑这个问题呢?主要有几个原因 如果 ...

  6. 单源最短路问题:OJ5——低德地图

    本题就是一道单源最短路问题.由于是稀疏图,我们采用Dijkstra算法. Dijkstra算法原理 Dijkstra算法的步骤 我们把所有的节点分为两个集合:被选中的(visited==1) 和 未被 ...

  7. 520,用Python定制你的《本草纲目女孩》

    摘要:让我们来用Python定制出心仪的"本草纲目女孩",敲出魔性的代码舞蹈,520,准备好心仪女孩的舞蹈视频,把这份别出心裁的礼物给TA 本文分享自华为云社区<[云驻共创] ...

  8. 用 notion 管理信用卡与花呗

    用 notion 管理信用卡与花呗 Notion原文,排版更佳 概述 不需要提醒功能和安卓用户可以忽略Scriptable和快捷指令 app的设置 Notion 建立信用卡表格,录入信用卡基本信息,自 ...

  9. nginx 主运行配置详解(nginx.conf)

    #==基础配置==# user nginx; #设置运行用户,当运行NGINX时,进程所使用的用户,则进程拥有该用户对文件或目录的操作权限. worker_processes 4; #设置工作进程数量 ...

  10. st表 LCA

    我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把 ...