проблема сборки и c-вызова по ссылке

#assembly #x86 #nasm

#сборка #x86 #nasm

Вопрос:

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

C-код:

 #include <stdio.h>

extern void f1(int,int*);

int main() {
    int z1 = 0;
    int z2;

    scanf("%d", amp;z1);

    f1(z1,amp;z2);
    printf("A1: %in",z2);

    return 0;
}
  

ассемблерный код:

  f1:
        push    ebp
        mov ebp,esp

        mov eax, [ebp 8]
        mov [ebp 12],eax

        pop ebp
        ret
  

Выходные данные должны быть равны входным, но это «случайное» отрицательное значение int, например «-5870340» или «-3303956».

Комментарии:

1. Обратите внимание, что ваш второй аргумент — это указатель. Вы должны разыменовать его. То, что вы сделали, было z2=amp;z1 не z2=z1 тем, что вы намеревались. Случайным отрицательным значением является указатель.

2. На самом деле f1() вообще не изменяется z2 . Он только перезаписывает свою копию указателя, main оставляя z2 неинициализированный мусор.

Ответ №1:

Поскольку вы передаете указатель, вам необходимо разыменовать его, чтобы изменить значение:

  f1:
   push ebp
   mov edx, [ebp 12]
   mov eax, [ebp 8]
   mov [edx], eax
   pop ebp
   ret
  

Итак, запишите значение указателя, а затем переместите первый параметр в то место, на которое он указывает.

Комментарии:

1. И, в зависимости от фактической платформы, компилятора и соглашения о вызовах, не используйте ebx , а скорее edx или ecx для этого.