首页 > 解决方案 > 在汇编 x86 中交换 2 个整数

问题描述

我有一个指向整数数组开头的整数指针,我试图在程序集 x86 中交换两个值。这是我的代码:

movq (%rdi,%rcx,4),%r8     # SWAP
movq 4(%rdi,%rcx,4),%r9   
movq %r9,(%rdi,%rcx,4)
movq %r8,4(%rdi,%rcx,4)

rdi包含两个值的指针和地址计算是正确的(rcx在第一次迭代中只是 0),但是,这是我进行交换时发生的情况:

(gdb) x/5wd $rdi
0x602010:    31    1    2    3
0x602020:    0
(gdb) x/5wd $rdi
0x602010:    1     2    2    3
0x602020:    0
(gdb) x/5wd $rdi
0x602010:    1     31    2    3
0x602020:    0

如您所见,第三个值被第一个和第二个值的交换所取代,我不明白为什么。关于我应该在哪里寻找我的错误的任何建议?

标签: cassemblyx86-64swap

解决方案


movq移动 8 个字节,而您希望它移动 4 个字节。
使用and (r8 和 r9 的低 32 位)movl代替。r8dr9d

或者反过来,偏移你的内存访问 8 个字节,而不是 4 个字节来交换 qwords。


推荐阅读