2015-12-05 3 views
1

Я пытался выяснить, как написать функцию замены x86 GAS для моей программы. Я знаю, что его легче сделать xchg или просто написать C, но я хочу, чтобы все это можно было написать.Как написать функцию свопинга в сборке?

На моем 1-й среднесрочных мы получили это как как функция подкачки:

movl 8(%ebp), %edx 
movl 12(%ebp), %ecx 
movl (%edx), %ebx 
movl (%ecx), %eax 
movl %eax, (%edx) 
movl %ebx, (%ecx) 

, но я получаю ошибку сегментации при выполнении этого. Не смогли добиться успеха в поиске моего ответа в другом месте в Интернете, поэтому помощь будет оценена по достоинству.

EDIT:

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 
+0

Мне кажется, что поставляемые 2 параметра являются указателями на 32-битные целые числа? Если вы не передаете указатели на целые числа в этот код, я, скорее всего, ожидаю его segfault. Может быть, вы просто передавали целочисленные значения, а не указатели на целые числа? –

+0

Хорошо, я попробую указать прямо сейчас. – Riker

+0

nope, не работает. По крайней мере, не указатели на массив. Вот мой код C 'void program2() { \t int numA [2] = {5,10}; \t int * num1 = & numA [0]; \t int * num2 = & numA [1]; \t int loop = 0; \t printf ("stop3 \ n"); \t для (loop = 0; loop <= 10; loop ++) \t { \t \t * num1 * = 2; \t \t * num2 * = 3; \t \t printf ("% d \ n% d \ n", * num1, * num2); \t \t _asSwap (* num1, * num2); \t \t printf ("stop5 \ n"); \t \t printf ("P2num1 =% d \ n P2num2 =% d \ n", * num1, * num2); \t} ' – Riker

ответ

1

Вы прошли значения, а не указатели. Если бы вы включили прототип в свой C, компилятор поймал бы это (вместо предупреждения о не объявленной функции и предполагая, что он принял int-параметры).

extern int _asSwap(int *a, int *b); 

Отладчик также поймал бы это, если вы проверили адрес, который был отменен.

Кроме того, не рекомендуется префикс имен функций C с помощью _. OS X префикс _ на имена символов C, а также Linux a.out (теперь замененный на ELF). Таким образом, вы в некоторых случаях нуждаетесь в ведущем _ в asm, но не используете его в C.

+0

да, вы правы, спасибо. Прошло некоторое время, так как я сделал указатели ха-ха. да, я не понимал, что передаю разыменованный указатель. Очень признателен. – Riker

+1

Смешные, указатели были моей первой догадкой, и это было с неполной информацией ;-). Не видел, чтобы он обновил комментарии и свой ответ кодом, который я просил. Я был слишком медленным. На другой вопрос! –

Смежные вопросы