Assembly 汇编与c-按引用调用问题
我试图在程序集中实现一个函数,其中第一个参数是输入值,第二个参数是返回值。我只是尝试将返回值设置为输入值。Assembly 汇编与c-按引用调用问题,assembly,x86,nasm,Assembly,X86,Nasm,我试图在程序集中实现一个函数,其中第一个参数是输入值,第二个参数是返回值。我只是尝试将返回值设置为输入值。 我已经编写了一个调用这个函数的小C程序 C代码: #include <stdio.h> extern void f1(int,int*); int main() { int z1 = 0; int z2; scanf("%d", &z1); f1(z1,&z2); printf("A1: %i\n",z2);
我已经编写了一个调用这个函数的小C程序 C代码:
#include <stdio.h>
extern void f1(int,int*);
int main() {
int z1 = 0;
int z2;
scanf("%d", &z1);
f1(z1,&z2);
printf("A1: %i\n",z2);
return 0;
}
输出应与输入相等,但它是一个“随机”负int值,如“-5870340”或“-3303956”。由于要传入指针,需要取消对它的引用以修改值:
f1:
push ebp
mov edx, [ebp+12]
mov eax, [ebp+8]
mov [edx], eax
pop ebp
ret
因此,捕获指针的值,然后将第一个参数移动到它所指向的位置。由于要传入指针,因此需要取消引用以修改该值:
f1:
push ebp
mov edx, [ebp+12]
mov eax, [ebp+8]
mov [edx], eax
pop ebp
ret
因此,捕获指针的值,然后将第一个参数移动到它所指向的位置。注意,第二个参数是指针。你应该取消对它的引用。你所做的是
z2=&z1
而不是你想要的z2=z1
。随机负值就是指针。实际上f1()
根本不修改z2
。它只覆盖指针的副本,将main
的z2
保留为未初始化的垃圾。请注意,第二个参数是指针。你应该取消对它的引用。你所做的是z2=&z1
而不是你想要的z2=z1
。随机负值就是指针。实际上f1()
根本不修改z2
。它只覆盖指针的副本,留下main
的z2
保存未初始化的垃圾。并且,根据实际的平台、编译器和调用约定,不使用ebx
,而是使用edx
或ecx
。并且,根据实际的平台、编译器和调用约定,不要使用ebx
,而应使用edx
或ecx
。