1 /* gcc -c -fomit-frame-pointer -fno-defer-pop callingconvention.c */
5 extern unsigned char *asma(unsigned char *s);
7 /* geprueft werden callee gesicherte Register: rbx,r12-r15,
8 * rsp (stackptr), rbp (frameptr) */
10 #define CHECKNUM 0x1234567812345678
11 unsigned char *asma_callchecking(unsigned char *s)
13 register long x0 asm("%rbx")=CHECKNUM+0;
14 register long x1 asm("%r12")=CHECKNUM+1;
15 register long x2 asm("%r13")=CHECKNUM+2;
16 register long x3 asm("%r14")=CHECKNUM+3;
17 register long x4 asm("%r15")=CHECKNUM+4;
18 register long x5 asm("%rbp")=CHECKNUM+5;
22 asm("movq %%rsp,%0":"=g"(origsp):);
24 if(x0!=CHECKNUM+0) exit(11);
25 if(x1!=CHECKNUM+1) exit(12);
26 if(x2!=CHECKNUM+2) exit(13);
27 if(x3!=CHECKNUM+3) exit(14);
28 if(x4!=CHECKNUM+4) exit(15);
29 if(x5!=CHECKNUM+5) exit(16);
30 asm("movq %%rsp,%0":"=g"(newsp):);
31 if(origsp!=newsp) exit(30);