Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编与c-按引用调用问题_Assembly_X86_Nasm - Fatal编程技术网

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