linux - Passing argument from C to Assembly -
i'm trying make program in c uses function assembly. below can see code:
sum_c.c
#include <stdio.h>  extern int _assemblysum(int x, int y);  int main(int argc, char *argv[]){     int total;      total = _assemblysum(4, 2);     printf("%d\n", total);     return 0; } assembly_sum.asm
section .data  section .text     global _assemblysum  _assemblysum:     push rbp     mov rbp, rsp     mov rax, [rbp+16]     mov rbx, [rbp+24]     add rax, rbx     pop rbp     ret compile
nasm -f elf64 assembly_sum.asm -o assembly_sum.o gcc c_sum.c assembly_sum.o -o sum ./sum when run program random numbers -1214984584 or 2046906200. know need use registers rdi, rsi, rdx , rcx because 64bit gnu/linux compiler uses them (passing arguments c 64bit linux assembly). how can that?
you may have confused calling convention being used.
linux uses 64-bit system v calling convention. under convention, registers preferred on stack passing of integer type parameters. registers integer passing used in following order:
- %rdi
- %rsi
- %rdx
- %rcx
- %r8
- %r9
if additional integer parameters used, passed on stack.
you can find detailed information in system v abi specification.