Linux 如何在汇编中编写交换函数?

Linux 如何在汇编中编写交换函数?,linux,assembly,x86,segmentation-fault,swap,Linux,Assembly,X86,Segmentation Fault,Swap,我一直在想如何为我的程序编写x86气体交换函数。我知道做xchg或者只写C更容易,但我想无论如何都能写出来 在我的第一个期中考试中,我们被赋予了互换功能: movl 8(%ebp), %edx movl 12(%ebp), %ecx movl (%edx), %ebx movl (%ecx), %eax movl %eax, (%edx) movl %ebx, (%ecx) 但运行此操作时,我收到一个分段错误。如果我在网上其他任何地方都找不到我的答案,我们将不胜感激 编辑: C代码: void

我一直在想如何为我的程序编写x86气体交换函数。我知道做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);

}

您传递的是值,而不是指针。如果您在C语言中包含了原型,编译器就会捕捉到这一点(而不是警告未声明的函数,并假设它使用int参数)

如果您检查了出现故障的地址,调试器也会捕捉到这一点


另外,在C函数名前面加上
\uuu
前缀是不正常的。OSX在C符号名称上加前缀
,LinuxA.out(现在被ELF取代)也是如此。因此,在某些情况下,asm中需要一个前导的
,但不要在C中使用它。

在我看来,提供的两个参数是指向32位整数的指针?如果您没有将指向整数的指针传递给此代码,那么我很可能认为它会出错。也许你只是在传递整数值,而不是指向整数的指针?好的,我现在就试试指针。不,不起作用。至少,不是指向数组的指针。这是我的C代码
void program2(){int-numA[2]={5,10};int*num1=&numA[0];int*num2=&numA[1];int-loop=0;printf(“stop3\n”);用于(loop=0;loop我必须看看整个汇编函数以及它是如何调用的。是的,你是对的,谢谢。我做指针已经有一段时间了哈哈。是的,我没有意识到我在传递未引用的指针。非常感谢。有趣的是,指针是我的第一个猜测,这是不完整的信息;-).没有看到他用我要求的代码更新了评论和答案。我太慢了。问了另一个问题!
_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
extern int _asSwap(int *a, int *b);