I am learning assembly language for 86-64.
I have learned that arguments are passed using the stacks. However, arguments have been passed using the registers, and one of them, edx is a volatile one. I am confused why values were not passed using stacks?
I used this site - https://godbolt.org/
I have written a following C code:-
int a,b=7,c=5,d=10;
int add(int bTemp,int cTemp, int dTemp){
int temp = bTemp + cTemp + dTemp;
return temp;
}
int main(){
a = add(b,c,d);
return 0;
}
It compiles to: -
a:
.zero 4
b:
.long 7
c:
.long 5
d:
.long 10
add(int, int, int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov DWORD PTR [rbp-24], esi
mov DWORD PTR [rbp-28], edx
mov edx, DWORD PTR [rbp-20]
mov eax, DWORD PTR [rbp-24]
add edx, eax
mov eax, DWORD PTR [rbp-28]
add eax, edx
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-4]
pop rbp
ret
main:
push rbp
mov rbp, rsp
mov edx, DWORD PTR d[rip]
mov ecx, DWORD PTR c[rip]
mov eax, DWORD PTR b[rip]
mov esi, ecx
mov edi, eax
call add(int, int, int)
mov DWORD PTR a[rip], eax
mov eax, 0
pop rbp
ret