回答
你可以使用一些数学运算做到这一点。我可以给你一个想法。希望能帮助到你!
我按照这个C代码:
int i=10; j=20
i=i+j;
j=i-j;
i=i-j;
mov ax,10
mov bx,20
add ax,bx
//mov command to copy data from accumulator to ax, I forgot the statement, now ax=30
sub bx,ax //accumulator vil b 10
//mov command to copy data from accumulator to bx, I forgot the statement now
sub ax,bx //accumulator vil b 20
//mov command to copy data from accumulator to ax, I forgot the statement now
汇编代码到目前为止不代表C代码!而且,当AX为累加器时,为什么要将数据从累加器复制到ax **? – 2015-01-29 18:17:42
为什么建议这样复杂的事情,当你只能使用xchg? – prl 2017-09-24 00:39:08
如果你真的需要换两个REG,xchg ax, bx
在大多数情况下所有现代CPU的最有效方式。 (您可以构造一个案例,其中由于周围的代码会导致一些其他奇怪的前端效果,因此多个单一顶级指令可能会更有效;或者,对于32位操作数大小,其中零延迟mov
使用3-mov序列英特尔CPU上的临时寄存器更好)。
对于代码大小XCHG-与斧只需要一个字节。这是0x90 NOP编码的来源:它的编号为xchg ax,ax
或xchg eax,eax
(32位模式)。在64位模式下,将xchg eax,eax
RAX截断为32位,所以0x90
是明确地一个NOP指令,不也是一个xchg
。交换其他任何一对寄存器需要2个字节用于xchg r, r/m
编码。 (+如果需要REX前缀在64位模式下)。
在实际的8086,代码取为通常的性能瓶颈,所以xchg
是由远的最佳方式,特别是在使用单字节xchg
- 与-AX短格式。
对于32位/ 64位寄存器,3 mov
与临时指令可受益于MOV-消除其中xchg
不能在当前英特尔CPU。 xchg
在Intel上是3个uops,它们都有1c的延迟并需要执行单元,所以一个方向有2c延迟,但另一个有1c延迟。请参阅Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures?了解更多关于当前CPU如何实现它的微架构细节。
对于AMD Ryzen,在32/64位regs上的xchg
是2个uops,并且在重命名阶段处理,因此它就像两个并行运行的mov
指令。在早期的AMD CPU上,它仍然是一个2 uop指令,但每路都有1c延迟。相比xchg
为寄存器
XOR-互换或添加/子交换或大于mov
其他任何其它多指令序列是没有意义的。它们都有2个和3个周期的延迟,以及更大的代码大小。唯一值得考虑的是mov
说明。
或者更好,解开循环或重新安排你的代码不需要交换,或者只需要一个mov
。
注意xchg
与内存有一个隐含的lock
前缀。做不是使用xchg
与内存,除非性能根本无关紧要,但代码大小。 (例如在自举程序中)。或者如果你需要它是原子的和/或完整的内存屏障,因为它们都是。
如果您需要与内存交换寄存器并且无法使用临时寄存器,则xor-swap实际上可能是最佳选择。使用临时存储器需要复制存储器值(例如,通过push [mem]
或者在加载+存储存储器操作数之前将寄存器溢出到第二暂存存储器位置)。
到目前为止的最低延迟方式仍然是一个临时寄存器;经常可以选择不在关键路径上,或者只需要重新加载(不是首先保存,因为该值已经在内存中,或者可以通过ALU指令从其他寄存器重新计算)。
; spill/reload another register
push edx ; save/restore on the stack or anywhere else
movzx edx, word [mem] ; or just mov dx, [mem]
mov [mem], ax
mov eax, edx
pop edx ; or better, just clobber a scratch reg
两个其他合理的(但更糟糕),用于与寄存器交换内存选项:不接触任何其它寄存器(除SP):
; using scratch space on the stack
push [mem] ; [mem] can be any addressing mode, e.g. [bx]
mov [mem], ax
pop ax ; dep chain = load, store, reload.
或不接触任何东西:
; using no extra space anywhere
xor ax, [mem]
xor [mem], ax ; read-modify-write has store-forwarding + ALU latency
xor ax, [mem] ; dep chain = load+xor, (parallel load)+xor+store, reload+xor
使用两个内存目标xor
和一个内存源将会导致吞吐量变差(更多的存储和更长的依赖链)。
推/拉版本仅适用于可以推/拉的操作数大小,但xor-swap适用于任何操作数大小。如果您可以在堆栈中使用临时文件,则除非需要代码大小和速度的平衡,否则保存/恢复版本可能更可取。
- 1. 8086汇编语言
- 2. 汇编语言8086添加使用32位寄存&值在64位?
- 3. 汇编语言整数寄存器
- 4. 汇编语言[EMU 8086]
- 5. 如何切换汇编语言中低位的位8086
- 6. 如何在微处理器8086中以汇编语言输入16位数字?
- 7. 转换一个16位的小数为2位,在MIPS汇编语言补
- 8. 程序集8086:仅汇总MOV和LEA的2个寄存器
- 9. 术语:汇编语言编程中的“寄存器”
- 10. MIPS汇编语言 - 临时寄存器vs保存的寄存器
- 11. 汇编,将一个8位寄存器移到一个16位寄存器,怎么样?
- 12. 8086汇编语言的简单问题
- 13. 8086资源的汇编语言
- 14. 8086汇编语言无符号解释
- 15. 使用8位寄存器(汇编)添加两个16位数字
- 16. 添加16位寄存器
- 17. XOR寄存器,寄存器(汇编)
- 18. 如何在汇编语言中添加两个16位数字的微处理器8086
- 19. 寄存器值8086
- 20. 如何在汇编语言中添加两个16位数字?
- 21. ASCII和64位寄存器汇编
- 22. 以十进制显示寄存器 - 汇编语言EASy68K
- 23. 汇编语言部 - 剩下的DX寄存器
- 24. 发送寄存器值到RAM汇编语言
- 25. 增加寄存器超过其限制。汇编语言添加
- 26. 汇编语言绝对地址和段寄存器
- 27. 使用所有寄存器,我该怎么办?汇编语言
- 28. LC-3汇编语言 - 交换值
- 29. 汇编程序设计 - 将32位寄存器的内容移动到16位寄存器?
- 30. 如何在寄存器中写入特定的位? (汇编语言)
[XOR SWAP](http://en.wikipedia.org/wiki/XOR_swap_algorithm) – Michael 2014-10-20 15:23:35
有一个'XCHG'指令... – Jester 2014-10-20 15:24:14
http://felixcloutier.com/x86/XCHG.html – 2017-10-01 18:50:10