У меня есть целочисленный указатель, указывающий на начало массива целых, и я пытаюсь поменять местами два значения в сборке 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
Как вы можете видеть, 3-е значение заменяется заменой первого и второго значений, и я не могу понять, почему. Любые предложения о том, где я должен искать свою ошибку?