[英]C inline assembly memory copy
我正在嘗試將一些內聯匯編編寫成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)
);
為什么會出現細分錯誤?
您的內聯匯編器代碼已損壞。 如果不將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文件中。
最好的選擇是C代碼:
target_array[target_idx] = source_array[source_idx];
只要索引處於受控狀態,就可以避免分段錯誤。
那么memcpy呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.