在程序集x86中交换2个整数

时间:2018-11-03 21:53:08

标签: c assembly x86-64 swap

我有一个整数指针,该整数指针指向一个int数组的开始,并且我试图在程序集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

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

1 个答案:

答案 0 :(得分:4)

movq移动8个字节,而您希望它移动4个字节。
改为使用movlr8dr9d(r8和r9的低32位)。

反之亦然,偏移您的内存可以互相访问8个字节而不是4个字节来交换qword。