0 0 0

科锐学习笔记-第三阶段-16位汇编 10 寄存器总结

admin
217 0

本文共计7541个字,预计阅读时长30.2分钟。

目录

寄存器

8086CPU有14个寄存器

它们的名称为:

AX、BX、CX、DX、**SI、DI、SP、BP**、 IP**CS、DS、ESSS、PSW**。

8086CPU所有的寄存器都是16位的,可以存放两个字节。

AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。

8086上一代CPU中的寄存器都是8位的;

为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。

H 高位 (8-15) L低位 (0-7)

AX可以分为AH和AL;

BX可以分为BH和BL;

CX可以分为CH和CL;

DX可以分为DH和DL;

1.通用寄存器(AX,BX,CX,DX)

这四个寄存器可以拆分为:高位和低位两部分,当做两个八位寄存器来使用

AX:临时存储,参与乘除法的运算

BX:存储偏移地址来访问内存地址空间

CX:条件转移指令的条件 或 循环语句的判断条件

DX:辅助AX,作临时存储,参与乘除法的运算

2.段寄存器(CS,DS,SS,ES)

8086CPU不支持将数据直接送入段寄存器的操作

CS:代码段寄存器,存储指令的段地址

DS:数据段寄存器,通常用来存放要访问数据的段地址

SS:栈段寄存器,存储栈的段地址

ES:附加段寄存器

IP:指令指针寄存器,用来存储当前指令的偏移地址

CS:IP 指向当前要执行的指令

SP:存放栈的偏移地址

SS:SP 就是指向当前栈的栈顶元素

SI 和 DI 是8086CPU 中和 bx 功能相近的寄存器,si 和 di 不能分成两个 8 位寄存器来使用,用来存储偏移地址

在 8086CPU 中,只有(bx,si,di,bp)这4寄存器可以进行内存单元的寻址

BP:当没有显性的给出段地址,而使用 bp 时,段地址默认在 ss 中

其他没有显性的给出段地址的,均默认在 ds 中

3.标志寄存器

PSW 三个作用:

(1). 用来存储相关指令的某些执行结果;

(2). 用来为CPU执行相关指令提供行为依据;

(3). 用来控制CPU的相关工作方式;

8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。

1.通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个).

数据寄存器分为:

AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.

BH&BL=BX(base):基址寄存器,常用于地址索引;

CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.

DH&DL=DX(data):数据寄存器,常用于数据传递。

他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。

另一组是指针寄存器和变址寄存器,包括:

SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置;

BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;

SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;

DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。

这4个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。

2.指令指针IP(Instruction Pointer)

指令指针IP是一个16位专用寄存器,它指向当前需要取出的指令字节,当BIU从内存中取出一个指令字节后,IP就自动加1,指向下一个指令字节。注意,IP指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(EA,Effective Address)。

3.标志寄存器FR(Flag Register)

8086有一个18位的标志寄存器FR,在FR中有意义的有9位,其中6位是状态位,3位是控制位。

OF: 溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

DF:方向标志DF位用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

IF:中断允许标志IF位用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:

(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;

(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

TF:跟踪标志TF。该标志可用于程序调试。TF标志没有专门的指令来设置或清楚。

(1)如果TF=1,则CPU处于单步执行指令的工作方式,此时每执行完一条指令,就显示CPU内各个寄存器的当前值及CPU将要执行的下一条指令。

(2)如果TF=0,则处于连续工作模式。

SF:符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

ZF: 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

AF:下列情况下,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字操作时,发生低字节向高字节进位或借位时;

(2)、在字节操作时,发生低4位向高4位进位或借位时。

PF:奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

CF:进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。)

4.段寄存器(Segment Register)

为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:

CS(Code Segment):代码段寄存器;

DS(Data Segment):数据段寄存器;

SS(Stack Segment):堆栈段寄存器;

ES(Extra Segment):附加段寄存器。

寄存器汇总

image.png

通用寄存器

数据寄存器

寄存器 描述 说明
EAX 累加器Accumulator 扩展累加寄存器(在乘/除法中被自动调用)Accumulator常用作函数的返回值
EBX 基址Base 基址寄存器,DS 段中的数据指针。
ECX 计数Count 常用作 循环计数器,在字符串和循环操作中常用,在循环指令(LOOP)或串操作中,ECX 用来进行循环计数,每执行一次循环,ECX 都会被CPU 自动减一。thiscall 用来保存this指针传参
EDX 数据Data 常用作 是数据寄存器,用来存放8字长的高32位

指针寄存器

寄存器 描述 说明
ESP 堆栈指针寄存器 Extend Stack Pointer SS 段中堆栈指针,专用指向堆栈 栈顶指针,ESP 用来寻址堆栈上的数据
EBP 基址指针寄存器Extend Base Pointer SS 段中堆栈内数据指针,指向最上面一个栈帧的栈顶的底部,表示数据在堆栈段中的基地址

变址寄存器

寄存器 描述 说明
ESI 源变址 Extend Source 扩展源指针(由高速内存数据传送指令使用),字符串操作源指针
EDI 目的变址Extend Destination Index 扩展目的指针(由高速内存数据传送指令使用),字符串操作目标指针

指令指针寄存器

EIP 指令寄存器EIP是对8086/80286指令指针寄存器的32位扩展,它包含着待执行指令的32位偏移量,该值总是相对CS所代表的段基址而言的。指令指针(总是指向下一条要执行的指令地址),不做他用;计算机通过CS:IP寄存器来控制指令序列的执行流程;IP寄存器是一个专用寄存器,不能直接赋值修改;IP 它与代码段寄存器 CS联用,永远存储着即将执行的指令的地址,每执行完一条指令,CPU都会根据CS:IP找到下一条指令,同时IP被赋值为再下一条指令的地址

标志寄存器

标志状态

寄存器 描述 说明
OF 溢出标志Overflow Flag 当我们讨论溢出时,讨论的是有符号数;若算数运算的结果有溢出,则OF置1主要针对有符号:以8位数为例,8位的范围是(-128~+127)如果运算结果超出这个范围,就产生了溢出,有溢出,说明有符号数 的运算结果不正确。
CF 进位标志Carry Flag 当我们讨论进位时,讨论的是无符号数;当运算结果的最高有效位有进位(加法)或借位(减法)是,进位标志位置1;主要针对无符号(无符号位):8位计算 进位作为临时第九位使用;8位存不下,就进位
ZF 零标志Zero Flag ZF=1:运算结果为0ZF=0:运算结果不为0
SF 符号标志Sign Flag 运算结果最高位为1,则SF=1,否则SF=0有符号数据用最高位表示符号,所以最高有效位就是符号标志的状态
AF 辅助进位标志Auxiliary Carry Flag 运算时低半字节由进位或借位时,AF=1
PF 奇偶标志Parity Flag 当运算结果最低8位中1的个数是偶数或0时 PF=1

控制标志

寄存器 描述 说明
IF 中断标志Interrupt-enable Flag 用于控制i外部可屏蔽中断是否可以被处理器响应IF=1 允许中断;IF=0 禁止中断
TF 陷阱标志Trap Flag TF=1:用于调试单步操作 TF=0:处理正常工作
DF 方向标志Direction Flag 1.用于串操作指令,控制地址ide变化方向;CLD Clear Direction 用于复位方向标志 执行后 DF=1

img

段寄存器

寄存器 描述 说明
CS 代码段Code Segment 存放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。
SS 堆栈段Stack Segment 指出当前堆栈的底部地址,即存放堆栈段的段基址。
DS 数据段Data Segment 指明数据段的起始地址
ES 附加段Extra Segment 指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。
FS 辅助段80386 新增 FS寄存器指向当前活动线程的TEB结构FS:[0x30] 指向PEB结构相关资料:https://bbs.pediy.com/thread-159935.htm
GS 辅助段80386 新增

系统表寄存器

寄存器 描述 说明
GDTR 全局描述符表寄存器Global Descriptor Table Register 保存GDT的地址,在Windbg 可“r gdtr”查看GDT的地址
LDTR 局部描述符表寄存器Local Descriptor Table Register 保存LDT的地址
IDTR 中断描述符表寄存器Interrupt Descriptor Table Register 保存IDT的地址 在Windbg 可“r idtr”查看GDT的地址
TR 任务状态寄存器Task-State Register TSS 资料:https://blog.csdn.net/chen1540524015/article/details/74075252

控制寄存器

寄存器 说明
CR0 CR0中各位含义如下:PE(Protection Enable)保护模式允许,PE=0表示CPU工作在实模式,PE=1表示CPU工作在保护模式MP(Monitor Coprocessor)监控协处理器,MP=1表示协处理器在工作,MP=0表示协处理器未工作。EM(Emulation)协处理器仿真,当MP=0,EM=1时,表示正在使用软件仿真协处理器工作。TS(Task Switched)任务转换,每当进行任务转换时,TS=1,任务转换完毕,TS=0。TS=1时不允许协处理器工作。 以上 4个定义从80286开始,下面的2个定义从80386开始存在ET(Extension Type)处理器扩展类型,反映了所扩展的协处理器的类型,ET=0为80287,ET=1为80387。PG(Paging)页式管理机制使能,PG=1时页式管理机制工作,否则不工作。从80486开始又增加了如下位定义。NE(Numeric Error)数值异常中断控制,NE=1时,如果运行协处理器指令发生故障,则用异常中断处理,NE=0时,则用外部中断处理。WP(Write Protect)写保护,当WP=1时,对只读页面进行写操作会产生页故障。AM(Alignment Mask)对齐标志,AM=1时,允许对齐检查,AM=0时不允许,关于对齐,在EFLAGS的AC标志时介绍过,在80486以后的CPU中,CPU进行对齐检查需要满足三个条件,AC=1、AM=1并且当前特权级为3。NW(Not Write-through)和CD(Cache Disable),这两个标志都是用来控制CPU内部的CACHE的,当NW=0且CD=0时,CACHE使能,其它的组合说起来比较复杂,如果有读者真的想搞清楚的话,可以参阅《Intel? 64 and IA-32 Architectures》中的“Software Developer’s Manual Volume 3A”这一册,在第10章对这两个标志的各种组合有比较详细的说明。
CR1 保留
CR2 CR2存放引起缺页异常的线性地址,只有在PG=1时,CR2才有效,当页故障处理程序被激活时,压入页故障处理程序堆栈中的错误码提供页故障的状态信息。
CR3 保存 页目录表的基址(DirBase
CR4 CR4是从Pentium CPU开始出现的。 VME(Virtual-8086 Mode Extensions)虚拟8086方式扩展,VME=1允许使用虚拟8086扩展模式,否则只能使用80386/80486的虚拟8086模式。PVI(Protected-Mode Virtual Interrupts)保护模式虚拟中断,PVI=1时,在保护模式下支持虚拟中断标志VIF(EFLAGS中),PVI=0则不支持虚拟中断标志。TSD(Time Stamp Disable)时间戳禁止,TSD=1时,允许在特权级为0的程序中执行RDTSC指令(读时间戳计数指令),TSD=0时,允许任何特权级执行RDTSC指令。DE(Debugging Extensions)调试扩展,PSE(Page Size Extensions)页大小扩展,PSE=1时,页大小可以扩展到2M或4M,PSE=0时,页大小只能是4K.PAE(Physical Address Extension)物理地址扩展,PAE=1时,页物理地址可以扩展到36bits以上,PAE=0时只能用32bits的物理地址。MCE(Machine-Check Enable)硬件检查使能,Pentium以后的CPU有一种硬件检测功能,MCE=1时允许使用该功能。PGE(Page Global Enable)全局页使能,PGE=1时,允许使用全局页,PGE=0时禁止使用全局页。PCE(Performance-Monitoring Counter Enable)性能监视计数器使能,当PCE=1时,允许在任何保护级下执行RDPMC指令,PCE=0时,只有特权级0的程序可以执行RDPMC指令。OSFXSR(Operating System Support for FXSAVE and FXRSTOR instructions)OSXMMEXCPT(Operating System Support for Unmasked SIMD Floating-Point Exceptions)VMXE(VMX-Enable Bit)VMX使能位,VMXE=1时,允许VMX操作。SMXE(SMX-Enable Bit)SMX使能位,SMXE=1时,允许SMX操作。OSXSAVE(XSAVE and Processor Extended States-Enable Bit)

调试寄存器

寄存器 说明
DR0~DR3 分别设置4个硬件断点的线性地址
DR4~DR5 保留
DR6 断点状态寄存器
DR7 断点控制寄存器(包括断点类型、断点长度,断点开放/禁止)

测试寄存器

寄存器 说明
TR0~TR2 保留
TR3~TR5 用作CACHE测试
TR6 命令测试寄存器
TR7 测试数据寄存器

特殊模块寄存器 MSR

说明
特殊执行的支持 WRMSR 特权写命令 ecx存放序号,执行完后数据放置在eax中
处理器特性和处理器模式支持 RDMER特权读命令 eax存放数据,ecx存放序号,执行后eax 写入到相应寄存器
功耗与温控管理、机器检查、调试扩展支持、性能监视计数 MSR寄存器的雏形开始于Intel 80386和80486处理器,到Intel Pentium处理器的时候,Intel就正式引入RDMSR和WRMSR两个指令用于读和写MSR寄存器,每个MSR寄存器都会有一个相应的ID,即MSR Index,或者也叫作MSR寄存器地址,当执行RDMSR或者WRMSR指令的时候,只要提供MSR Index就能让CPU知道目标MSR寄存器。这些MSR寄存器的编号(MSR Index)、名字及其各个数据区域的定义可以在Intel x86架构手册”Intel 64 and IA-32 Architectures Software Developer's Manual"的Volume 4中找到。

最新回复 ( 0 )
全部楼主