I have difficulties understanding the assembly language output created by gcc of a simple C program.
Here's The C-Code of the program:
#include <stdio.h>
#include <stdlib.h>
int sum1=1;
int sum2=1;
int add(int s1, int s2){
return s1+s2;
}
int main(int argc,char** agrv){
int res=sum1+sum2;
return 0;
}
Here's the assembly code created by gcc:
.file "main.c"
.globl sum1
.data
.align 4
sum1:
.long 1
.globl sum2
.align 4
sum2:
.long 1
.text
.globl add
.def add; .scl 2; .type 32; .endef
.seh_proc add
add:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
.seh_endprologue
movl %ecx, 16(%rbp)
movl %edx, 24(%rbp)
movl 16(%rbp), %edx
movl 24(%rbp), %eax
addl %edx, %eax
popq %rbp
ret
.seh_endproc
.def __main; .scl 2; .type 32; .endef
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
movl %ecx, 16(%rbp)
movq %rdx, 24(%rbp)
call __main
movl sum1(%rip), %edx
movl sum2(%rip), %eax
addl %edx, %eax
movl %eax, -4(%rbp)
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-posix-seh-rev2, Built by MinGW-W64 project) 7.1.0"
I have difficulties understanding the order of the operands of some of the instructions in the assembly code (see also the memory layout picture for reference Memory Layout). First, there is the instruction
pushq %rbp
which pushes the base pointer of the caller onto the stack. After this instruction comes the following instruction:
movq %rsp, %rbp
This instruction should set the base pointer of the callee to the value of the current stack pointer. However, shouldn't the order of the two operands be the opposite (e.g. movq %rbp, %rsp)?
A similar "problem" occurs at the instruction:
addl %edx, %eax
Here, the result of the operation is stored in the register %edx instead of %eax (which is used to return the function argument).
Pretty much all sources I consulted so far on the Internet claimed that the result of an instruction is stored in the first argument of an instruction?