字位扩展指令,字扩展和位扩展是啥

首页 > 经验 > 作者:YD1662022-11-18 00:57:59

字位扩展指令,字扩展和位扩展是啥(5)

指令前缀:
分为4组,每个前缀最多一个字节,一条指令最多4个前缀。

  1. 第1组锁与重复(Lock and repeat)
    锁(LOCK)编码为:F0H。用于互斥访问共享内存的操作。
    非零时重复(REPNE/REPNZ)编码为:F2H。用于字符串操作指令。
    为零时重复(REP/REPE/REPZ)编码为:F3H。用于字符串操作指令。
  2. 第2组段覆盖与分支提示
    段覆盖(Segment override):CS、SS、DS、ES、FS、GS的段覆盖前缀的编码分别是2EH、36H、3EH、26H、64H、65H(在分支指令中使用未定义)。
    分支提示(Branch hints),只用于条件分支指令Jcc。提示分支不发生编码为2EH;提示分支发生编码为3EH。
  3. 第3组操作数长度覆盖(Operand-size override)编码为66H。用于在16位与32位操作数切换。例如,指令MOV ax, 1234H对应的十六机制机器码是"66 B8 34 12"(66即是操作数长度覆盖前缀)
  4. 第4组地址长度覆盖(Address-size override)编码为67H。用于在16位与32位地址切换。例如,指令MOV eax, [si]对应的十六进制机器码是"67 8B 04"(67即使地址长度覆盖前缀)

REX前缀:

REX前缀是64位模式下使用的指令前缀字节,如下作用:

并非所有指令在64位模式下都需要REX前缀。只有当指令引用扩展寄存器之一或使用64位操作数时,才需要前缀。如果REX前缀在没有任何意义的情况下使用,则会忽略它。每条指令只允许一个REX前缀。如果使用,REX前缀字节必须紧挨着操作码字节或转义操作码字节(0FH)。当REX前缀与包含强制前缀的指令一起使用时,强制前缀必须出现在REX之前,这样REX前缀就可以直接位于操作码或转义字节的前面。例如,带有REX前缀的CVTDQ2PD应该将REX放在F3和0F E6之间。其他位置被忽略。15字节的指令大小限制仍然适用于带有REX前缀的指令。

操作码(OPCode):

一个主操作码的长度可以是1、2或3个字节。一个额外的3位操作码字段有时被编码在ModR/M字节中。更小的字段可以在主操作码中定义。这些字段定义了操作方向、位移大小、寄存器编码、条件代码或符号扩展。一个操作码所使用的编码字段 操作码使用的编码字段根据操作的类别而不同。

ModR/M 和 SIB 字节:

许多在内存中引用操作数的指令在主操作码后面都有一个寻址形式的说明符字节(称为ModR/M字节)。ModR/M字节包含三个字段的信息:

某些编码的ModR/M字节需要第二个寻址字节(SIB字节)。32位寻址的基数加索引和比例加索引形式需要SIB字节。SIB字节包括以下字段:

偏移和立即数字节:

有些寻址形式包括紧跟在ModR/M字节后面的位移(如果有的话,也可以是SIB字节)。如果需要一个位移,它可以是1、2或4个字节。

如果指令指定了立即操作数,则操作数总是紧跟在任何偏移字节之后。立即操作数可以是1、2或4个字节。

其他

操作模式内存模型操作模式和内存模型关系

平坦内存

分段内存

实模式内存

Intel保护模式

Y

Y

Y

实地址模式

N

N

Y

系统管理模式

N

N

Y

兼容模式

Y

Y

Y

64位模式

Y

N

N


操作数

源操作数:

目的操作数:

立即数:

MOV RAX,1122334455667788H

寄存器:

字位扩展指令,字扩展和位扩展是啥(6)

32位寄存器

字位扩展指令,字扩展和位扩展是啥(7)

64位寄存器

内存地址(内存有效地址):

Intel语法形式为 segreg:[base index*scale disp],而AT&T语法形式为 %segreg:disp(?se,%index,scale)

字位扩展指令,字扩展和位扩展是啥(8)

上一页123下一页

栏目热文

文档排行

本站推荐

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