我有一个整数指针,该整数指针指向一个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
如您所见,第三个值被替换为第一个和第二个值,我不明白为什么。关于我应该在哪里寻找错误的任何建议?
答案 0 :(得分:4)
movq
移动8个字节,而您希望它移动4个字节。
改为使用movl
和r8d
和r9d
(r8和r9的低32位)。
反之亦然,偏移您的内存可以互相访问8个字节而不是4个字节来交换qword。