asma: formel "umgeformt" und im endeffekt einen befehl "gewonnen" (haha)
[uebersetzerbau-ss10.git] / asma / callingconvention.c
diff --git a/asma/callingconvention.c b/asma/callingconvention.c
new file mode 100644 (file)
index 0000000..5ed4e52
--- /dev/null
@@ -0,0 +1,33 @@
+/* gcc -c -fomit-frame-pointer -fno-defer-pop callingconvention.c */
+
+#include <stdlib.h>
+
+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;
+}