Я пытался выяснить, как написать функцию замены 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
Мне кажется, что поставляемые 2 параметра являются указателями на 32-битные целые числа? Если вы не передаете указатели на целые числа в этот код, я, скорее всего, ожидаю его segfault. Может быть, вы просто передавали целочисленные значения, а не указатели на целые числа? –
Хорошо, я попробую указать прямо сейчас. – Riker
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