簡體   English   中英

如何在匯編中編寫交換函數?

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

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