Home | History | Annotate | Download | only in x86
      1 
      2 #include <stdio.h>
      3 
      4 typedef  unsigned int  UInt;
      5 
      6 UInt test_jcxz ( UInt arg )
      7 {
      8    UInt block[2];
      9    block[0] = arg;
     10    block[1] = 0xdeadbeef;
     11    __asm__ __volatile__(
     12       "movl %0,%%ecx\n\t"
     13       "movl $0,%%eax\n"
     14       "0:\n\t"
     15       "jcxz 1f\n\t"
     16       "addl $1, %%eax\n\t"
     17       "subl $1, %%ecx\n\t"
     18       "jmp 0b\n"
     19       "1:\n\t"
     20       "movl %%eax, %1"
     21       : /*out*/ : /*in*/ "m"(block[0]),
     22                          "m"(block[1]) : /*trash*/ "eax","ecx","cc","memory"
     23    );
     24    return block[1];
     25 }
     26 
     27 UInt test_jecxz ( UInt arg )
     28 {
     29    UInt block[2];
     30    block[0] = arg;
     31    block[1] = 0xdeadbeef;
     32    __asm__ __volatile__(
     33       "movl %0,%%ecx\n\t"
     34       "movl $0,%%eax\n"
     35       "0:\n\t"
     36       "jecxz 1f\n\t"
     37       "addl $1, %%eax\n\t"
     38       "subl $1, %%ecx\n\t"
     39       "jmp 0b\n"
     40       "1:\n\t"
     41       "movl %%eax, %1"
     42       : /*out*/ : /*in*/ "m"(block[0]),
     43                          "m"(block[1]) : /*trash*/ "eax","ecx","cc","memory"
     44    );
     45    return block[1];
     46 }
     47 
     48 int main ( void )
     49 {
     50    UInt arg = 0x01028374;
     51    printf("test_jcxz(0x%x)  = 0x%x\n", arg, test_jcxz(arg));
     52    printf("test_jecxz(0x%x) = 0x%x\n", arg, test_jecxz(arg));
     53    return 0;
     54 }
     55