Quantcast
Channel: Active questions tagged kernel - Stack Overflow
Viewing all articles
Browse latest Browse all 6393

why we need to push the stack (rbp) before calling an extern C function in assembly on MacOs? [duplicate]

$
0
0

I am new to assembly and I was trying to call an extern function of C within assembly code, I tried to call strlen function as shown in the below code:

global _my_strlensection .textextern _strlen_my_strlen:               ;rdi register has the address of the string that is passed within the main function    call    _strlen       ;call strlen which is a C function and pass to it rdi    ret                   ;the return value of strlen is stored in rax and it will be returned to our main

this is my main function:

#include <stdio.h>int     my_strlen(char *str);int     main(){    printf("len = %d\n",my_strlen("this len must be 19"));    return (0);}

however when I compile and run it with nasm, it gives me a segmentation fault as shown below :

[1]    58770 segmentation fault  ./a.out

I searched a little bit, and I found that you should push the stack before calling an extern function and pop it later, so I changed the code like this:

global _my_strlensection .textextern _strlen_my_strlen:    push    rbp            ;Push stack    call    _strlen        ;call strlen which is a C function and pass to it rdi    pop     rbp            ;Pop stack    ret                    ;the return value of strlen is stored in rax and it will be

and it worked perfectly as shown in the result:

len = 19

I don't know why we need to push the stack, and why it segfaults if you didn't so, what's happening in the background and what has got changed after calling strlen, does calling strlen affect the stack and how?!

Btw I tried to push other registers instead of rbp for example push rdxpop rdx and it worked, and this is making me more confused than before, hope you explain it in a good way, and thanks in advance.


Viewing all articles
Browse latest Browse all 6393

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>