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