在调用函数内部的其他函数之前,函数如何以及在何处保存“一个函数的返回值”?

玻璃

我写了这段代码:

#include<stdio.h>
int valFunc(int val){
     return val;
}


int main(){
     int a  = 5;
     int b = 7;

     printf("%d",valFunc(a)+valFunc(b));

     return 0;

}

里面的printf()的函数main()中,后valFunc(一)被调用和返回值5,在哪里呢main函数调用保存在此之前值5 valFunc(B)

我知道,如果该函数的编写方式如下所示,那么它将把函数valFunc(5)valFunc(7)的返回值分别保存在整数变量ab中

#include<stdio.h>
int valFunc(int val){
     return val;
}


int main(){


  int a = valFunc(5);
  int b = valFunc(7);

  printf("%d",a+b);


  return 0;
}

但是在以前的代码中,我无法理解该函数将返回值保存在哪里?它会创建隐式变量并使用它们来保存其进度,然后再调用其他函数吗?或者是否存在其他机制?请解释。

是否在调用其他函数之前创建任何临时变量以将这些值存储在运行时堆栈上在我编写的第二个代码中,很明显,main()将把这些值存储在ab中,并将它们放在运行时堆栈中。但是由于没有变量,main()将如何对第一个代码执行此操作?

弗兰基

它非常依赖于系统体系结构,但是在最一般的情况下,当在C中调用函数时,结果将在特定的寄存器中返回,并且始终保持相同。如果我们专注于Intel X32-64,则返回值将在寄存器eax中传递32位,在rax中传递64。在这种情况下,从IA32的编译器发出的代码将(或多或少):

lea eax, a                  //Get parameter address
mov eax, dword ptr [eax]    //Get the value
push eax                    //pass parameter on stack
call valFunc                //call function
mov ebx, eax                //save result in register ebx
lea eax, ba                 //Get parameter address
mov eax, dword ptr [eax]    //Get the value
push eax                    //pass parameter on stack
call valFunc                //call function
add  eax, ebx               //sum the results
push eax                    //pass the sum as parameter on stack
lea eax, fmtstr             //Get the address of the format string "%d"
push eax                    //push it onto the stack
call _printf

作为一种变体,结果可以保存在堆栈中(即在所有寄存器都在使用的情况下):

....
call valFunc                //call function
push eax                    //save result on the stack
lea eax, ba                 //Get parameter address
mov eax, dword ptr [eax]    //Get the value
push ebx                    //save ebx on the stack
mov ebx, eax                //save result in register ebx
call valFunc                //call function
add  eax, ebx               //sum the results
pop  ebx                    //Restore register ebx from stack
push eax                    //pass the sum as parameter on stack
....

我希望这可以澄清这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何重复一个函数,直到它的返回值与之前的返回值匹配?

只能调用一个函数的返回值,而不可以调用其中的其他指令吗?

PHP在返回值之前遍历一个函数

在Scheme返回值中具有一个函数(或执行其他操作)并自行调用

仅调用一次函数,然后让其他函数访问它的返回值?

Angular 2 在启动另一个函数之前等待函数返回值

JavaScript Fetch无法返回值调用其他函数

一个简单的函数在一个模式中返回值,但不是其他模式

如何从包含 Promise 和 .then 的函数返回一个对象,以及如何在另一个函数中获取返回值?

调用另一个模拟函数时更改模拟函数的返回值

在返回值之前的函数内部添加超时函数

在两次调用一个函数以及将返回值存储在变量之间选择哪个?

如何在另一个函数中引用 2 个函数的返回值?

UML类图:如果该函数返回一个函数调用,该函数的返回类型将如何处理?

如何使用函数返回值作为PHP中另一个函数的参数?

如何调用另一个函数内部的函数?

您可以在存储其他函数返回值的函数内部创建局部变量吗?

如何在if语句中调用函数并保存返回值

如何窥探内部函数的返回值

Angular 2+ 从服务中的函数返回值到其他服务中的函数调用

我将如何只调用一次函数,而其他任何调用都将返回第一次调用的最后一个值?

如何将一个函数的输入值与另一个函数的返回值进行比较?

如何调用另一个函数的返回内部函数?

在继续操作之前,先检查一个Promise函数的返回值。方法错误?

如何获取另一个函数的__LINE__的值(在调用该函数之前)?

如何使用从其他函数到下一个函数的返回答案?

如何从另一个函数调用一个函数以及如何调用?

R:让一个函数调用其他函数以及将参数传递给它们

如何从内部函数返回值到外部函数