Reputation: 27
I've been trying to figure out how to write a x86 GAS swap function for my program. I know its easier to do xchg or just write it C, but I want to be able to write it out anyways.
On my 1st midterm we were given this as as swap function:
movl 8(%ebp), %edx
movl 12(%ebp), %ecx
movl (%edx), %ebx
movl (%ecx), %eax
movl %eax, (%edx)
movl %ebx, (%ecx)
but I receive a segmentation fault when running this. Haven't been able to succeed in finding my answer anywhere else on the web, so much help would be appreciated.
EDIT:
C CODE:
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);
}
Assembly:
_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
Upvotes: 1
Views: 4596
Reputation: 365842
You passed the values, not the pointers. If you'd included the prototype in your C, the compiler would have caught that (instead of warning about an un-declared function, and assuming it took int parameters).
extern int _asSwap(int *a, int *b);
A debugger would also have caught this, if you checked the address that segfaulted.
Also, it's not normal to prefix your C function names with _
. OS X prefixes _
onto C symbol names, and so did Linux a.out (now replaced by ELF). So you in some cases need a leading _
in the asm, but don't use it in C.
Upvotes: 1