Here is some code I was given, but its the first time I've seen the function asm . I'm not too familiar with assembly. I was hoping someone could just explain what the asm function is doing.
/* stack.c */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
unsigned long int sp;
int cp(char *str)
{
char buffer[12];
asm("movl %%ebp, %0" : "=r" (sp));
printf("$ebp is 0X%lx\n",sp);
strcpy(buffer, str);
printf("Buffer is at address %p\n",(void*)(&buffer));
return 1;
}
int main(int argc, char **argv)
{
char str[517];
FILE *badfile;
badfile = fopen("badfile", "r");
fread(str, sizeof(char), 517, badfile);
cp(str);
printf("Returned Properly\n");
return 1;
}
Could someone just explain what the following does?
asm("movl %%ebp, %0" : "=r" (sp));
printf("$ebp is 0X%lx\n",sp);
"asm" in this code is not a function, it is a gcc extension (also inherited by clang) that allows inlining assembly code. You can read about it here: https://gcc.gnu.org/onlinedocs/gcc-6.4.0/gcc/Using-Assembly-Language-with-C.html
asm("movl %%ebp, %0" : "=r" (sp));
This substitutes whatever the compiler is using to address sp for %0. It then becomes something like
MOVE EBP, sp
Be clear I mean something like this. If your environment prefixes _ to global variables, it could translate into
MOVE EBP, _sp
(Other substitutions are possible.) Thus it moves the value of the hardware EBP register into your C variable sp.
printf("$ebp is 0X%lx\n",sp);
This prints the value of sp which is the value of the EBP register.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.