Home | History | Annotate | Download | only in x86
      1 /* This tests the somewhat obscure 32-bit Intel aam and aad instructions */
      2 /* by Vince Weaver (vince _at_ deater.net ) */
      3 
      4 #include <stdio.h>
      5 
      6 int parity(int v) {
      7 
      8     int i;
      9     int p = 1;
     10 
     11     for (i = 0; i < 8; i++)
     12       p ^= (1 & (v >> i));
     13     return p;
     14 }
     15 
     16 int main(int argc, char **argv) {
     17 
     18   printf("test begins\n");
     19   unsigned short i,out;
     20   unsigned int flags;
     21   int cf __attribute__((unused)),pf,af __attribute__((unused)),zf,sf;
     22   int of __attribute__((unused));
     23 
     24   /* test AAM */
     25 
     26   for(i=0;i<65535;i++) {
     27     // printf("%d, %d, %d\n",i,(i&0xff)/10,(i&0xff)%10);
     28     out=i;
     29     __asm__ __volatile__ ("mov %2 ,%%ax\n"
     30 			  "aam\n"
     31 			  "pushf\n"
     32 			  "mov %%ax, %0\n"
     33 			  "pop %%eax\n"
     34 			  "mov %%eax, %1\n"
     35 			  :"=r"(out), "=r"(flags)  /* outputs */
     36 			  :"r"(out)     /* input */
     37 			  :"%eax"     /* clobbered */
     38     );
     39     cf=!!(flags&0x1);
     40     pf=!!(flags&0x4);
     41     af=!!(flags&0x10);
     42     zf=!!(flags&0x40);
     43     sf=!!(flags&0x80);
     44     of=!!(flags&0x800);
     45 
     46   //    printf("%d, %d, %d, ",i,(out>>8)&0xff,out&0xff);
     47   //  printf("%x CF=%d PF=%d AF=%d ZF=%d SF=%d OF=%d\n",
     48   //	   flags,cf,pf,af,zf,sf,of);
     49 
     50     if (zf && ((out&0xff)!=0)) {
     51       printf("Error with aam (zf)!\n");
     52     }
     53     if (pf != parity(out&0xff)) {
     54       printf("Error with aam (pf)!\n");
     55     }
     56     if (sf != !!(out&0x80)) {
     57       printf("Error with aam (sf)!\n");
     58     }
     59 
     60 
     61     if ( ((out>>8)&0xff) != ((i&0xff)/10)) {
     62       printf("Error with aam!\n");
     63     }
     64     if ( (out&0xff) != ((i&0xff)%10)) {
     65       printf("Error with aam!\n");
     66     }
     67 
     68   }
     69 
     70   /* test AAD */
     71 
     72   for(i=0;i<65535;i++) {
     73     //    printf("%x, %d\n",i, ((((i>>8)&0xff)*10)+(i&0xff))&0xff );
     74     out=i;
     75     __asm__ __volatile__ ("mov %2 ,%%ax\n"
     76 			  "aad\n"
     77 			  "pushf\n"
     78 			  "mov %%ax, %0\n"
     79 			  "pop %%eax\n"
     80 			  "mov %%eax, %1\n"
     81 			  :"=r"(out), "=r"(flags)  /* outputs */
     82 			  :"r"(out)     /* input */
     83 			  :"%eax"     /* clobbered */
     84 );
     85 
     86     cf=!!(flags&0x1);
     87     pf=!!(flags&0x4);
     88     af=!!(flags&0x10);
     89     zf=!!(flags&0x40);
     90     sf=!!(flags&0x80);
     91     of=!!(flags&0x800);
     92 
     93     //       printf("%x, %d ",i,out);
     94     //   printf("%x CF=%d PF=%d AF=%d ZF=%d SF=%d OF=%d\n",
     95     //	   flags,cf,pf,af,zf,sf,of);
     96 
     97     if (zf && ((out&0xff)!=0)) {
     98       printf("Error with aad (zf)!\n");
     99     }
    100     if (pf != parity(out&0xff)) {
    101       printf("Error with aad (pf)!\n");
    102     }
    103     if (sf != !!(out&0x80)) {
    104       printf("Error with aad (sf) %d %d!\n",sf,!!(out&0x80));
    105     }
    106 
    107     if ( out != ( ((((i>>8)&0xff)*10)+(i&0xff))&0xff) ) {
    108        printf("Error with aad!\n");
    109     }
    110   }
    111 
    112   printf("test completed\n");
    113   return 0;
    114 
    115 }
    116