:96:错误:'(% rax,% edx,4)'不是有效的基/索引表达式
第97行:错误:ウ-4(% rax,% edx,4)Ж不是有效的基/索引表达式。
第101行:错误:'(% rax,% edx,4)'不是有效的基/索引表达式
第102行:错误:ウ-4(% rax,% edx,4)Ж不是有效的基/索引表达式。
我收到这些错误消息,但不确定如何修复。
这是我的代码:
__asm__ (
"loop: \n\t"
"movl $1,%3\n\t"
"movl $0, %6\n"
"start: \n\t"
"movl (%1,%3,4),%4\n\t"
"movl -4(%1, %3, 4), %5\n\t"
"cmpl %4, %5\n\t"
"jle next\n\t"
"xchgl %4, %5\n\t"
"movl %4, (%1, %3, 4)\n\t"
"movl %5, -4(%1, %3, 4)\n\t"
"movl $1, %6\n\t"
"next: \n\t"
"incl %3 \n\t"
"cmpl %3, %2\n\t"
"jge start\n\t"
"cmpl $0, %6\n\t"
"je end\n\t"
"jmp loop\n\t"
"end: \n\t"
一些帮助解释如何修复这些错误信息,请。我试图使一个泡沫排序在ASM。
3条答案
按热度按时间k5ifujac1#
您没有说您的目标处理器,但它似乎是x64。在x64上,
(%rax, %edx, 4)
不是法律的的组合。请查阅处理器手册以获得有效寻址模式的列表。我猜您的目标是(%rax, %rdx, 4)
。9rbhqvlz2#
问题的最可能原因是在
%3
操作数中使用了显式32位整数类型。您没有显示内联程序集的约束列表。但如果您显示了,则会出现上述情况:在32位模式下编译该代码可以正常工作:
但在64位模式下,编译器/汇编器并不喜欢这样:
解决这个问题的方法是使用
#include <stdint.h>
并将最终用于寻址的寄存器操作数(作为基址或变址寄存器)转换为uintptr_t
(这是一种整数数据类型,保证与指针“大小兼容”,无论您使用的是32位还是64位)。通过这种更改,64位编译成功并创建以下输出:祝您的内联程序集“与32/64位无关”!
y4ekin9u3#
我在一个简单的数组求和中也遇到了同样的问题,在使用了@FrankH.的建议后,(欢呼@FrankH.)
这是我为gcc编写的内联asm代码