80486和Pentium增强和扩充指令

80486Pentium增强和扩充指令有以下几条:

 

1.       BSWAP指令

 

功能: 字节交换

语法: BSWAP r32

 

反转 32 位(目标)寄存器的字节顺序:位 0 7 位与位 24 31 交换,位 8 15 位与位 16 23 交换。提供此指令是为了将低位在先、高位在后的值转换成高位在先、低位在后的格式,或者正相反。

 

要交换字值(16 位寄存器)中的字节,请使用 XCHG 指令。BSWAP 指令引用 16 位寄存器时,结果未定义。

 

2.       BT指令

 

功能: 位测试

语法: BT r/m32,r32

 

按照位偏移量操作数(第二个操作数)指定的位置,从位串(由第一个操作数指定,称为位基址)中选择位,并将该位的值存储到 CF 标志。位基址操作数可以是寄存器或内存位置;位偏移量操作数可以是寄存器或立即数。如果位基址操作数指定一个寄存器,则指令按 16 32(取决于寄存器大小)对位偏移量操作数求模,以便任何位的位置都可以分别在 16 位或 32 位寄存器中选择。如果位基址操作数指定一个内存位置,则它代表包含位串中位基址(指定字节的位 0)的字节的内存地址(请参阅影响的标志)。然后,对于寄存器偏移量,偏移量操作数选择在 -231 231 - 1 范围内位的位置;对于立即偏移量,则选择在 0 31 范围内位的位置。

 

有些汇编器通过结合使用立即数位偏移量字段与内存操作数位移量字段支持大于 31 的立即数位偏移量。在这种情况下,立即数位偏移量的低 3 位或低 5 位(对于 16 位操作数是 3 位,对于 32 位操作数是 5 位)存储在立即数位偏移量字段中,高位则由汇编器进行移位,并与寻址模式中的字节位移量相结合。如果高位不为零,处理器将忽略它们。

 

3.       BTC指令

 

功能: 位测试并求补

语法: BTC r/m32,r32

 

按照位偏移量操作数(第二个操作数)指定的位置,从位串(由第一个操作数指定,称为位基址)中选择位,并将该位的值存储到 CF 标志,然后对位串中所选的位求补。位基址操作数可以是寄存器或内存位置;位偏移量操作数可以是寄存器或立即数。如果位基址操作数指定一个寄存器,则指令按 16 32(取决于寄存器大小)对位偏移量操作数求模,以便任何位的位置都可以分别在 16 位或 32 位寄存器中选择。如果位基址操作数指定一个内存位置,则它代表包含位串中位基址(指定字节的位 0)的字节的内存地址。然后,对于寄存器偏移量,偏移量操作数选择在 -231 231- 1 范围内位的位置;对于立即偏移量,则选择在 0 31 范围内位的位置。

 

有些汇编器通过结合使用立即数位偏移量字段与内存操作数位移量字段支持大于 31 的立即数位偏移量。

 

4.       BTR指令

 

功能: 位测试并复位

语法: BTR r/m32,r32

 

按照位偏移量操作数(第二个操作数)指定的位置,从位串(由第一个操作数指定,称为位基址)中选择位,并将该位的值存储到 CF 标志,然后将位串中所选的位清除为 0。位基址操作数可以是寄存器或内存位置;位偏移量操作数可以是寄存器或立即数。如果位基址操作数指定一个寄存器,则指令按 16 32(取决于寄存器大小)对位偏移量操作数求模,以便任何位的位置都可以分别在 16 位或 32 位寄存器中选择。如果位基址操作数指定一个内存位置,则它代表包含位串中位基址(指定字节的位 0)的字节的内存地址。然后,对于寄存器偏移量,偏移量操作数选择在 -231 231 - 1 范围内位的位置;对于立即偏移量,则选择在 0 31 范围内位的位置。

 

5.       BTS指令

 

功能: 位测试并设置

语法: BTS r/m32,r32

 

按照位偏移量操作数(第二个操作数)指定的位置,从位串(由第一个操作数指定,称为位基址)中选择位,并将该位的值存储到 CF 标志,然后将位串中所选的位设置为 1。位基址操作数可以是寄存器或内存位置;位偏移量操作数可以是寄存器或立即数。如果位基址操作数指定一个寄存器,则指令按 16 32(取决于寄存器大小)对位偏移量操作数求模,以便任何位的位置都可以分别在 16 位或 32 位寄存器中选择。如果位基址操作数指定一个内存位置,则它代表包含位串中位基址(指定字节的位 0)的字节的内存地址。然后,对于寄存器偏移量,偏移量操作数选择在 -231 231 - 1 范围内位的位置;对于立即偏移量,则选择在 0 31 范围内位的位置。

 

6.       CMPXCHG指令

 

功能: 比较交换

语法: CMPXCHG r/m32,r32

 

比较 ALAX EAX 寄存器中的值(具体取决于操作数的大小)与第一个操作数(目标操作数)。如果两个值相等,则将第二个操作数(源操作数)加载到目标操作数。否则,将目标操作数加载到 ALAX EAX 寄存器。

 

此指令可以配合 LOCK 前缀使用,此时指令将以原子方式执行。为了简化处理器的总线接口,目标操作数可以不考虑比较结果而接收一个写入周期。如果比较失败,则写回目标操作数;否则,将源操作数写入目标。(处理器永远不会只产生锁定读取而不产生锁定写入)。

 

7.       XADD指令

 

功能: 交换并相加

语法: XADD r/m32, r32

 

交换第一个操作数(目标操作数)与第二个操作数(源操作数),然后将这两个值的和加载到目标操作数。目标操作数可以是寄存器或内存位置;源操作数是寄存器。此指令可以配合 LOCK 前缀使用。

 

8.       INVD指令

 

功能: 使内部缓存失效

语法: INVD

 

使处理器的内部缓存失效(清除),并发出一个专用总线周期,指示外部缓存也进行清除。内部缓存保存的数据不写回主内存。

 

执行此指令之后,处理器不等待外部缓存完成清除操作,而是继续执行指令。缓存清除信号的响应由硬件负责。

 

INVD 指令是特权指令。处理器在保护模式中运行时,程序或过程的 CPL 必须是 0 才能执行此指令。

 

谨慎使用此指令。内部缓存且未写回主内存的数据可能会丢失。除非有特殊要求或好处,可以清除内存而不将修改的缓存线写回内存(例如,在测试或错误恢复场合,缓存与主内存的一致性无关紧要),否则软件应使用 WBINVD 指令。

 

9.       WBINVD指令

 

功能: 使内部缓存失效

语法: WBINVD

 

写回处理器内部缓存中所有修改的缓存线,并使这些内部缓存失效(清除)。接着,指令发出一个特殊功能的总线周期,指示外部缓存写回修改的数据;并发出另一个总线周期,指示应该使外部缓存失效。

 

执行此指令之后,处理器并不等待外部缓存完成写回与清除操作,而是继续执行指令。缓存写回与清除信号的响应由硬件负责。

 

WBINVD 指令是特权指令。处理器在保护模式中运行时,程序或过程的 CPL 必须是 0 才能执行此指令。在缓存与主内存是否一致无关紧要的情况下,软件可以使用 INVD 指令。

 

10.   INVLPG指令

 

功能: 使内部缓存失效

语法: INVLPG m

 

使源操作数指定的转译查询缓冲区 (TLB) 项目失效(清除)。源操作数是内存地址。处理器确定包含该地址的页,并清除该页的 TLB 项目。

 

INVLPG 指令是特权指令。处理器在保护模式中运行时,程序或过程的 CPL 必须是 0 才能执行此指令。

 

INVLPG 指令通常只清除指定的页的 TLB 项目;不过在某些情况下,它会清除整个 TLB

 

11.   CMPXCHG8B指令

 

功能: 比较并交换 8 字节

语法: CMPXCHG8B m64

 

比较 EDX:EAX 中的 64 位值与操作数(目标操作数)。如果这两个值相等,则将 ECX:EBX 中的 64 位值存储到目标操作数。否则,将目标操作数的值加载到 EDX:EAX。目标操作数是 8 字节内存位置。对于一对 EDX:EAX ECX:EBX 寄存器,EDX ECX 包含 64 位值的 32 个高位,EAX EBX 包含 32 个低位。

 

此指令可以配合 LOCK 前缀使用,此时指令将以原子方式执行。为了简化处理器的总线接口,目标操作数可以不考虑比较结果而接收一个写入周期。如果比较失败,则写回目标操作数;否则,将源操作数写入目标。(处理器永远不会只产生锁定读取而不产生锁定写入)。

 

12.   RDMSR指令

 

功能: 从型号专用寄存器读取

语法: RDMSR

 

ECX 寄存器指定的 64 位型号专用寄存器 (MSR) 的内容加载到寄存器 EDX:EAXEDX 寄存器中加载 MSR 的高 32 位,EAX 寄存器中加载低 32 位。在读取的 MSR 中,如果实现的位数小于 64,则返回 EDX:EAX 中未实现的位的值未定义。

 

此指令必须在特权级别 0 或实地址模式中执行;否则会生成一般保护性异常 #GP(0)。在 ECX 中指定保留的或未实现的 MSR 地址,也会导致一般保护性异常。

 

MSR 控制用于测试、执行跟踪、性能监视及机器检查错误等功能。使用此指令之前,应该使用 CPUID 指令确定是否支持 MSR (EDX[5]=1)

 

13.   WDMSR指令

 

功能: 写入型号专用寄存器

语法: RDMSR

 

14.   RSM指令

 

功能: 从系统管理模式恢复

语法: RSM

 

将程序控制权从系统管理模式 (SMM) 返回给处理器收到 SMM 中断时被中断的应用程序或操作系统过程。处理器的状态从进入 SMM 时创建的转储信息中还原。在状态还原过程中,如果处理器检测到状态信息无效,则进入关闭状态。以下无效信息可能会导致关闭:

 

l         CR4 的任何保留位设置为 1

l         CR0 中位的任何非法组合,如(PG=1 PE=0)或(NW=1 CD=0)。(仅限英特尔(R) 奔腾(R) Intel486 处理器)。

l         状态转储基址字段中存储的值不是 32 KB 对齐的地址。

 

型号专用寄存器的内容不受从 SMM 返回的影响。

 

15.   RDTSC

 

功能: 读取时间标签计数器

语法: RDTSC

 

将处理器的时间标签计数器的当前值加载到 EDX:EAX 寄存器。时间标签计数器包含在 64 MSR 中。MSR 的高 32 位加载到 EDX 寄存器,低 32 位加载到 EAX 寄存器。处理器每时钟周期递增时间标签计数器 MSR 一次,在处理器复位时将它重设为 0

 

寄存器 CR4 中的时间标签禁用 (TSD) 标志限制 RDTSC 的使用。清除 TSD 标志时,RDTSC 指令可以在任何特权级别执行;设置此标志时,指令只能在特权级别 0 执行。在特权级别 0 执行时,时间标签计数器还可以使用 RDMSR 指令读取。

 

RDTSC 指令不是序列化指令。这样,在读取计数器之前,它没有必要等到前面的所有指令都已执行。类似地,在执行读取操作之前,后面的指令也可以开始执行。

你可能感兴趣的:(80486和Pentium增强和扩充指令)