Home > Software design >  How do function calls return a value in x86-64 assembly?
How do function calls return a value in x86-64 assembly?

Time:11-24

Say I have a function foo defined as:

def foo(x,y):
  return x   y

and say I have function call:

foo(2,3)

which corresponds to the x86-64:

movq $2 %rdi
movq $3 %rsi
call foo

I am aware that if the function foo has a return value it will be stored in the register %rax. but what does this mean exactly?

the assembly would be something like:

movq $2 %rdi
movq $3 %rsi
call foo

foo:
    movq -8(%rsb) %rax
    addq -16(%rsb) %rax

can you please finish the definition of foo in assembly? does it use %rax? how does it use %rax?

My question is how %rax is used to get the return value of a function and how this value in %rax gets passed between the caller and callee. thanks

CodePudding user response:

Just to illustrate how this works, I'll use your function foo as an example:

def foo(x,y):
  return x   y

main:
   z = foo(7,10) * 3

So here's how the value of z would be calculated. (Chances are what would actually happen is that the compiler would just precalculate 17*3 and load it as a constant, but that's not helpful for what I'm trying to demonstrate.)

main:
  mov  $7,            
  • Related