/* gcc -c -fomit-frame-pointer -fno-defer-pop callingconvention.c */ #include extern unsigned char *asma(unsigned char *s); /* geprueft werden callee gesicherte Register: rbx,r12-r15, * rsp (stackptr), rbp (frameptr) */ #define CHECKNUM 0x1234567812345678 unsigned char *asma_callchecking(unsigned char *s) { register long x0 asm("%rbx")=CHECKNUM+0; register long x1 asm("%r12")=CHECKNUM+1; register long x2 asm("%r13")=CHECKNUM+2; register long x3 asm("%r14")=CHECKNUM+3; register long x4 asm("%r15")=CHECKNUM+4; register long x5 asm("%rbp")=CHECKNUM+5; static void* origsp; void*newsp; unsigned char *res; asm("movq %%rsp,%0":"=g"(origsp):); res=asma(s); if(x0!=CHECKNUM+0) exit(11); if(x1!=CHECKNUM+1) exit(12); if(x2!=CHECKNUM+2) exit(13); if(x3!=CHECKNUM+3) exit(14); if(x4!=CHECKNUM+4) exit(15); if(x5!=CHECKNUM+5) exit(16); asm("movq %%rsp,%0":"=g"(newsp):); if(origsp!=newsp) exit(30); return res; }