您的内联汇编代码已损坏。你不能直接使用 EAX 和 EBX 而不将它们添加到 clobber 列表中。否则编译器不知道哪些寄存器已被修改。
您修改的其中一个寄存器很可能包含该死的重要内容,后来导致分段错误。
此代码会将一个元素从 array1 复制到 array2:
asm (
"movl (%0), %%eax \n\t" /* read first dword from array1 into eax */
"movl %%eax, (%1) \n\t" /* write dword into array2
: /* outputs */
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "eax", "memory"
);
具有适当寄存器约束的更好版本会像这样删除硬编码的 EAX:
int dummy;
asm (
"movl (%1), %0 \n\t"
"movl %0, (%2) \n\t"
: /* outputs, temps.. */ "=r" (dummy)
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "memory"
);
顺便说一句-总的来说,我觉得您对汇编程序还不太熟悉。由于所有编译器的魔力,编写内联汇编程序有点困难。我建议你开始在汇编程序中编写一些简单的函数,然后先将它们放入一个单独的.S 文件中。这样容易得多。。