[英]How to write a swap function in assembly?
我一直在嘗試找出如何為我的程序編寫x86 GAS交換函數的方法。 我知道它更容易執行xchg或只編寫C,但是無論如何我都希望能夠將其寫出來。
在我的第一期中期,我們將其作為交換函數:
movl 8(%ebp), %edx
movl 12(%ebp), %ecx
movl (%edx), %ebx
movl (%ecx), %eax
movl %eax, (%edx)
movl %ebx, (%ecx)
但運行此程序時出現分段錯誤。 未能成功在網絡上其他任何地方找到我的答案,將不勝感激。
編輯:
C代碼:
void program2()
{
int numA[2] = {5,10};
int *num1 = &numA[0];
int *num2 = &numA[1];
int loop=0;
printf("stop3\n");
for(loop=0;loop<=10;loop++)
{
*num1 *=2;
*num2 *=3;
printf("%d\n%d\n",*num1,*num2);
_asSwap(*num1,*num2);
printf("stop5\n");
printf("P2num1= %d\n P2num2= %d\n",*num1,*num2);
}
部件:
_asSwap:
push %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %ecx
movl (%edx), %ebx
movl (%ecx), %eax
movl %eax, (%edx)
movl %ebx, (%ecx)
pop %ebp
ret
您傳遞的是值,而不是指針。 如果將原型包含在C語言中,則編譯器將捕獲該錯誤(而不是警告未聲明的函數,並假定它帶有int參數)。
extern int _asSwap(int *a, int *b);
如果您檢查了段錯誤的地址,調試器也將捕獲此錯誤。
另外,在C函數名稱前加上_
是不正常的。 OS X在C符號名稱前加上_
,Linux a.out(現在由ELF代替)也是如此。 因此,在某些情況下,您需要在asm中使用前導_
,但不要在C中使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.