2

我正在尝试将一些内联程序集写入C。我有两个数组作为输入,我需要将array1中的一个元素复制到array2中,以下是我目前拥有的:

asm (
 "movl %0,%%eax;"
 "movl %1,%%ebx;"
 "movl (%%eax),%%ecx;"
 "movl %%ecx,(%ebx);"

 "xor %%ecx,%%ecx;"
 "movl 4(%%eax),%%ecx;"
//do something on %ecx
 "movl %%ecx,4(%ebx);"  //write second
 :
 :"a"(array1),"b"(array2)
);

为什么会出现分段错误?

4

3 回答 3

8

您的内联汇编代码已损坏。你不能直接使用 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 文件中。这样容易得多。。

于 2009-11-01T14:05:34.873 回答
3

您最好的选择是 C 代码:

target_array[target_idx] = source_array[source_idx];

只要索引受到控制,这就避免了分段错误。

于 2009-11-01T00:38:06.683 回答
0

那么 memcpy 呢?

于 2010-04-08T12:26:15.230 回答