Home | History | Annotate | Download | only in amd64
      1 
      2 #include <stdio.h>
      3 
      4 typedef unsigned long long int ULong;
      5 typedef unsigned           int UInt;
      6 
      7 ULong arg64, res64;
      8 
      9 extern void foo64 ( void );
     10 asm("\n"
     11 "foo64:\n"
     12 "\tpushq %rcx\n"
     13 
     14 "\tmovq $0, %rax\n"
     15 "\tmovq arg64, %rcx\n"
     16 
     17 "Lagain64:\n"
     18 "\taddq $177, %rax\n"
     19 "\tdecq %rcx\n"
     20 "\tjrcxz Lout64\n"
     21 "\tjmp Lagain64\n"
     22 
     23 "Lout64:\n"
     24 "\tmovq %rax, res64\n"
     25 
     26 "\tpopq %rcx\n"
     27 "\tret\n"
     28 );
     29 
     30 
     31 UInt arg32, res32;
     32 
     33 extern void foo32 ( void );
     34 asm("\n"
     35 "foo32:\n"
     36 "\tpushq %rcx\n"
     37 
     38 "\tmovq $0, %rax\n"
     39 "\tmovl arg32, %ecx\n"
     40 
     41 "Lagain32:\n"
     42 "\taddq $177, %rax\n"
     43 "\tdecl %ecx\n"
     44 "\tjecxz Lout32\n"
     45 "\tjmp Lagain32\n"
     46 
     47 "Lout32:\n"
     48 "\tmovl %eax, res32\n"
     49 
     50 "\tpopq %rcx\n"
     51 "\tret\n"
     52 );
     53 
     54 
     55 
     56 int main ( void )
     57 {
     58   arg64 = 100;
     59   res64 = 0;
     60   foo64();
     61   printf("%lld\n", res64);
     62 
     63   arg32 = 1234;
     64   res32 = 0;
     65   foo32();
     66   printf("%d\n", res32);
     67 
     68   return 0;
     69 }
     70