C内联汇编内存复制

时间:2009-11-01 00:18:18

标签: c assembly inline-assembly memcpy

我正在尝试将一些内联汇编写入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)
);

为什么会出现分段错误?

3 个答案:

答案 0 :(得分:5)

您的内联汇编程序代码已损坏。如果不将它们添加到clobber列表中,则无法直接使用EAX和EBX。否则编译器现在不会修改哪些寄存器。

你修改过的寄存器很可能包含了一些非常重要的东西,后来导致了分段错误。


此代码将一个元素从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文件中..这样更容易..

答案 1 :(得分:3)

您最好的选择是C代码:

target_array[target_idx] = source_array[source_idx];

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

答案 2 :(得分:0)

memcpy怎么样?