c - 在 x86 汇编中交换 2 个整数

标签 c assembly x86-64 swap

我有一个整数指针指向整数数组的开头,并且我正在尝试交换程序集 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

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

最佳答案

movq 移动了 8 个字节,而您希望它移动 4 个字节。
请使用 movl 以及 r8dr9d(r8 和 r9 的低 32 位)。

或者相反,将内存访问彼此偏移 8 个字节而不是 4 个字节来交换 qword。

关于c - 在 x86 汇编中交换 2 个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53135838/

相关文章:

linux - 我可以在MacOS的_start处通过代码执行 `ret`指令吗? Linux的?

assembly - 了解汇编语言中的 cmpb 和循环

windows - Windows 上的 CMake -G Ninja 指定 x64

performance - 为什么 GCC 和 Clang 不使用 cvtss2sd [内存]?

c - 如何在 Ubuntu x64 中使用 ptrace 插入 int3?

c - 如何从标准输入获取整数?快速地。可以用准确性换取性能

c - http 套接字请求返回尾随字符

include - NASM - 相关包含文件

c - SocketCan Can ID 优先级

c - malloc的作用(正确使用malloc)