aad_aam.c revision b32f58018498ea2225959b0ba11c18f0c433deef
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
6int 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
16int 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