Обмен 2 целых в сборке x86 - PullRequest
       20

Обмен 2 целых в сборке x86

0 голосов
/ 04 ноября 2018

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

1 Ответ

0 голосов
/ 04 ноября 2018

movq перемещается на 8 байт, в то время как вы ожидаете, что он будет перемещаться на 4.
Вместо этого используйте movl с r8d и r9d (младшие 32 бита r8 и r9).

Или наоборот, смещение вашей памяти обращается к 8 байтам друг от друга вместо 4, чтобы поменять местами слова.

...