1
2#include <stdio.h>
3
4void do_pushb_pos ( void )
5{
6   unsigned int block[3];
7   __asm__ __volatile__ (
8      "movl  %0, %%edx\n\t"
9      "pushl $0x55555555\n\t"
10      "movl  %%esp, 0(%%edx)\n\t"
11      ".byte 0x6A,0x22\n\t"
12      "movl  %%esp, 4(%%edx)\n\t"
13      "popl  %%eax\n\t"
14      "movl  %%eax,8(%%edx)\n\t"
15      "movl  0(%%edx),%%esp\n\t"
16      "addl  $4, %%esp"
17      : : "r"(&block) : "eax","edx","cc","memory"
18    );
19    printf("  pushb_pos: delta %d, top32 0x%08x\n",
20           block[0] - block[1], block[2]);
21}
22
23void do_pushb_neg ( void )
24{
25   unsigned int block[3];
26   __asm__ __volatile__ (
27      "movl  %0, %%edx\n\t"
28      "pushl $0x55555555\n\t"
29      "movl  %%esp, 0(%%edx)\n\t"
30      ".byte 0x6A,0xEE\n\t"
31      "movl  %%esp, 4(%%edx)\n\t"
32      "popl  %%eax\n\t"
33      "movl  %%eax,8(%%edx)\n\t"
34      "movl  0(%%edx),%%esp\n\t"
35      "addl  $4, %%esp"
36      : : "r"(&block) : "eax","edx","cc","memory"
37    );
38    printf("  pushb_neg: delta %d, top32 0x%08x\n",
39           block[0] - block[1], block[2]);
40}
41
42void do_pushw_pos ( void )
43{
44   unsigned int block[3];
45   __asm__ __volatile__ (
46      "movl  %0, %%edx\n\t"
47      "pushl $0x55555555\n\t"
48      "movl  %%esp, 0(%%edx)\n\t"
49      "pushw $0x3344\n\t"
50      "movl  %%esp, 4(%%edx)\n\t"
51      "popl  %%eax\n\t"
52      "movl  %%eax,8(%%edx)\n\t"
53      "movl  0(%%edx),%%esp\n\t"
54      "addl  $4, %%esp"
55      : : "r"(&block) : "eax","edx","cc","memory"
56    );
57    printf("  pushw_neg: delta %d, top32 0x%08x\n",
58           block[0] - block[1], block[2]);
59}
60
61void do_pushw_neg ( void )
62{
63   unsigned int block[3];
64   __asm__ __volatile__ (
65      "movl  %0, %%edx\n\t"
66      "pushl $0x55555555\n\t"
67      "movl  %%esp, 0(%%edx)\n\t"
68      "pushw $0xDDCC\n\t"
69      "movl  %%esp, 4(%%edx)\n\t"
70      "popl  %%eax\n\t"
71      "movl  %%eax,8(%%edx)\n\t"
72      "movl  0(%%edx),%%esp\n\t"
73      "addl  $4, %%esp"
74      : : "r"(&block) : "eax","edx","cc","memory"
75    );
76    printf("  pushw_pos: delta %d, top32 0x%08x\n",
77           block[0] - block[1], block[2]);
78}
79
80void do_pushl_pos ( void )
81{
82   unsigned int block[3];
83   __asm__ __volatile__ (
84      "movl  %0, %%edx\n\t"
85      "pushl $0x55555555\n\t"
86      "movl  %%esp, 0(%%edx)\n\t"
87      "pushl $0x67675656\n\t"
88      "movl  %%esp, 4(%%edx)\n\t"
89      "popl  %%eax\n\t"
90      "movl  %%eax,8(%%edx)\n\t"
91      "movl  0(%%edx),%%esp\n\t"
92      "addl  $4, %%esp"
93      : : "r"(&block) : "eax","edx","cc","memory"
94    );
95    printf("  pushl_pos: delta %d, top32 0x%08x\n",
96           block[0] - block[1], block[2]);
97}
98
99void do_pushl_neg ( void )
100{
101   unsigned int block[3];
102   __asm__ __volatile__ (
103      "movl  %0, %%edx\n\t"
104      "pushl $0x55555555\n\t"
105      "movl  %%esp, 0(%%edx)\n\t"
106      "pushl $0x98988787\n\t"
107      "movl  %%esp, 4(%%edx)\n\t"
108      "popl  %%eax\n\t"
109      "movl  %%eax,8(%%edx)\n\t"
110      "movl  0(%%edx),%%esp\n\t"
111      "addl  $4, %%esp"
112      : : "r"(&block) : "eax","edx","cc","memory"
113    );
114    printf("  pushl_neg: delta %d, top32 0x%08x\n",
115           block[0] - block[1], block[2]);
116}
117
118
119void do_66pushb_pos ( void )
120{
121   unsigned int block[3];
122   __asm__ __volatile__ (
123      "movl  %0, %%edx\n\t"
124      "pushl $0x55555555\n\t"
125      "movl  %%esp, 0(%%edx)\n\t"
126      ".byte 0x66,0x6A,0x22\n\t"
127      "movl  %%esp, 4(%%edx)\n\t"
128      "popl  %%eax\n\t"
129      "movl  %%eax,8(%%edx)\n\t"
130      "movl  0(%%edx),%%esp\n\t"
131      "addl  $4, %%esp"
132      : : "r"(&block) : "eax","edx","cc","memory"
133    );
134    printf("66pushb_pos: delta %d, top32 0x%08x\n",
135           block[0] - block[1], block[2]);
136}
137
138void do_66pushb_neg ( void )
139{
140   unsigned int block[3];
141   __asm__ __volatile__ (
142      "movl  %0, %%edx\n\t"
143      "pushl $0x55555555\n\t"
144      "movl  %%esp, 0(%%edx)\n\t"
145      ".byte 0x66,0x6A,0xEE\n\t"
146      "movl  %%esp, 4(%%edx)\n\t"
147      "popl  %%eax\n\t"
148      "movl  %%eax,8(%%edx)\n\t"
149      "movl  0(%%edx),%%esp\n\t"
150      "addl  $4, %%esp"
151      : : "r"(&block) : "eax","edx","cc","memory"
152    );
153    printf("66pushb_neg: delta %d, top32 0x%08x\n",
154           block[0] - block[1], block[2]);
155}
156
157
158int main ( void )
159{
160  do_pushb_pos();
161  do_pushb_neg();
162  do_pushw_pos();
163  do_pushw_neg();
164  do_pushl_pos();
165  do_pushl_neg();
166
167  do_66pushb_pos();
168  do_66pushb_neg();
169  return 0;
170}
171