#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
для этого.