簡體   English   中英

C內聯匯編內存副本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM