c - 在汇编 x86 中交换 2 个整数
问题描述
我有一个指向整数数组开头的整数指针,我试图在程序集 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 个字节。
使用and (r8 和 r9 的低 32 位)movl
代替。r8d
r9d
或者反过来,偏移你的内存访问 8 个字节,而不是 4 个字节来交换 qwords。
推荐阅读
- aframe - A Frame VR 耳机/浏览器兼容性
- azure - Azure Web App 仅通过应用程序网关并禁用直接访问
- python - 表名上的 SQL 语法错误
- android - Android TypefaceSpan NoSuchMethodError for new TypefaceSpan(Typeface)
- codenameone - 如何阻止 Codenameone 中的 MapContainer 类拖动/平移
- qt - qml中的编排
- python - 操作 Python 魔术方法
- pandas - 大熊猫的反电话?
- python - 循环中的数字平方
- javascript - 如何将事件侦听器重新绑定到已删除并再次添加的元素