arm64: codea/abgabe_aa.0
[uebersetzerbau-ss10.git] / asma / callingconvention.c
1 /* gcc -c -fomit-frame-pointer -fno-defer-pop callingconvention.c */
2
3 #include <stdlib.h>
4
5 extern unsigned char *asma(unsigned char *s);
6
7 /* geprueft werden callee gesicherte Register: rbx,r12-r15, 
8  * rsp (stackptr), rbp (frameptr) */
9
10 #define CHECKNUM 0x1234567812345678
11 unsigned char *asma_callchecking(unsigned char *s)
12 {
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;
19   static void* origsp;
20   void*newsp;
21   unsigned char *res;
22   asm("movq %%rsp,%0":"=g"(origsp):);
23   res=asma(s);
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);
32   return res;
33 }