我正在尝试将一些内联汇编写入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)
);
为什么会出现分段错误?
答案 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"
);
答案 1 :(得分:3)
您最好的选择是C代码:
target_array[target_idx] = source_array[source_idx];
只要索引受到控制,这就可以避免分段错误。
答案 2 :(得分:0)
memcpy怎么样?