在程序集 x86 中交换 2 个整数
Swapping 2 integers in assembly x86
我有一个指向整数数组开头的整数指针,我正试图交换程序集 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 个值被第一个和第二个值的交换所取代,我不明白为什么。关于我应该在哪里寻找我的错误的任何建议?
movq
移动 8 个字节,而您期望它移动 4 个字节。
使用 movl
代替 r8d
和 r9d
(r8 和 r9 的低 32 位)。
或者反过来,将您的内存访问彼此偏移 8 个字节而不是 4 个字节以交换 qword。
我有一个指向整数数组开头的整数指针,我正试图交换程序集 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 个值被第一个和第二个值的交换所取代,我不明白为什么。关于我应该在哪里寻找我的错误的任何建议?
movq
移动 8 个字节,而您期望它移动 4 个字节。
使用 movl
代替 r8d
和 r9d
(r8 和 r9 的低 32 位)。
或者反过来,将您的内存访问彼此偏移 8 个字节而不是 4 个字节以交换 qword。