XCHG
交换登记册/有登记册的记忆
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
90+rw | XCHG AX, r16 | O | 有效 | 有效 | 与AX交换r16. |
90+rw | XCHG r16, AX | O | 有效 | 有效 | 与 r16 交换 AX 。 |
90+rd | XCHG EAX, r32 | O | 有效 | 有效 | 与EAX交换r32. |
REX.W + 90+rd | XCHG RAX, r64 | O | 有效 | 不可编码 | 与RAX交换r64. |
90+rd | XCHG r32, EAX | O | 有效 | 有效 | 与 r32 交换 EAX. |
REX.W + 90+rd | XCHG r64, RAX | O | 有效 | 不可编码 | 与 r64 交换 RAX. |
86 /r | XCHG r/m8, r8 | MR | 有效 | 有效 | 以 r/m8 的字节交换 r8 (字节寄存器). |
86 /r | XCHG r8, r/m8 | RM | 有效 | 有效 | 从 r/m8 交换字节与 r8 (字节寄存器). |
87 /r | XCHG r/m16, r16 | MR | 有效 | 有效 | 以 r/m16 的单词交换 r16. |
87 /r | XCHG r16, r/m16 | RM | 有效 | 有效 | 从 r/m16 与 r16 交换单词 。 |
87 /r | XCHG r/m32, r32 | MR | 有效 | 有效 | 用r/m32的双字交换r32. |
REX.W + 87 /r | XCHG r/m64, r64 | MR | 有效 | 不可编码 | 用 r/m64 的四字交换 r64 。 |
87 /r | XCHG r32, r/m32 | RM | 有效 | 有效 | 从r/m32与r32交换双词. |
REX.W + 87 /r | XCHG r64, r/m64 | RM | 有效 | 不可编码 | 以 r64 交换 r/m64 的四字. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
O
AX/EAX/RAXlectura y escrituraopcode.reglectura y escritura操作码字节自身的低三位
O
opcode.reglectura y escritura操作码字节自身的低三位AX/EAX/RAXlectura y escritura
MR
modrm.rmlectura y escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移modrm.reglecturaModRM 字节的 reg 字段(第 5-3 位)
RM
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
说明
交换目的地(第一)和源(第二)操作数的内容。 操作数可以是两个通用登记册或一个登记册和一个内存位置. 如果引用一个内存操作数,处理器的锁定协议在交换操作期间自动执行,无论LOCK前缀是否存在,或IOPL的值. (关于锁定协议的更多信息,见本章中的LOCK前缀描述. )
本指令对于实施过程同步的semaphores或类似的数据结构很有用. (见英特尔(R)64和IA-32架构软件开发者手册第3A卷第9章中的"巴士锁定",关于巴士锁定的更多信息).
XCHG指令也可以用来代替16位操作数的BSWAP指令.
在64位模式下,指令的默认操作大小为32位. 使用REX的前缀形式为REX.R,允许访问额外的注册(R8-R15). 使用REX前缀,形式为REX.W,促进运行到64位. 参见本节开头的汇总图,用于编码数据和限制.
NOTE
XCHG(E)AX,(E)AX(编码指令字节为90H)是NOP的别名,不分数据大小前缀,包括REX.W.
行动
TEMP := DEST;
DEST := SRC;
SRC := TEMP;受影响的旗帜
None.
异常
保护模式
#GP(0) | 如果 操作数 或 内存操作数 处于不可写入的区段中。如果 内存操作数 的有效地址位于 CS 、 DS 、 ES 、 FS 或 GS 区段限制之外。如果 DS 、 ES 、 FS 或 GS 登记册中包含 NULL 段选择子 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用LOCK前缀,但目的地不是内存操作数. |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#UD | 如果使用LOCK前缀,但目的地不是内存操作数. |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用对齐检查, 并使用不对齐的内存引用 。 |
#UD | 如果使用LOCK前缀,但目的地不是内存操作数. |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. #PF(fault-code) 如果发生 页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用LOCK前缀,但目的地不是内存操作数. |