looper.c revision 5303d79ffc8d117b2d73d0b1a8f7d017988bac16
1
2#include <stdio.h>
3
4int arg = 0;
5int res = 0;
6
7extern void loop_plain ( void );
8asm("\n"
9".text\n"
10".globl loop_plain\n"
11"loop_plain:\n"
12"\tpushl %ecx\n"
13"\tmovl $999, %eax\n"
14"\tmovl arg, %ecx\n"
15
16".Lmn123plain:\n"
17"\tdecl %eax\n"
18"\tdecl %eax\n"
19"\tdecl %eax\n"
20"\tloop .Lmn123plain\n"
21
22"\tmovl %eax, res\n"
23"\tpopl %ecx\n"
24"\tret\n"
25);
26
27extern void loop_ne ( void );
28asm("\n"
29".text\n"
30".globl loop_ne\n"
31"loop_ne:\n"
32"\tpushl %ecx\n"
33"\tmovl $999, %eax\n"
34"\tmovl arg, %ecx\n"
35
36".Lmn123ne:\n"
37"\tdecl %eax\n"
38"\tdecl %eax\n"
39"\tdecl %eax\n"
40"\tloopne .Lmn123ne\n"
41
42"\tmovl %eax, res\n"
43"\tpopl %ecx\n"
44"\tret\n"
45);
46
47extern void loop_e ( void );
48asm("\n"
49".text\n"
50".globl loop_e\n"
51"loop_e:\n"
52"\tpushl %ecx\n"
53"\tmovl $999, %eax\n"
54"\tmovl arg, %ecx\n"
55
56".Lmn123e:\n"
57"\tdecl %eax\n"
58"\tdecl %eax\n"
59"\tdecl %eax\n"
60/* invert the Z flag */
61"\tpushfl\n"
62"\txorl $64, 0(%esp)\n"
63"\tpopfl\n"
64"\tloope .Lmn123e\n"
65
66"\tmovl %eax, res\n"
67"\tpopl %ecx\n"
68"\tret\n"
69);
70
71int main ( void )
72{
73   res = 0; arg = 10;  loop_plain(); printf("res = %d\n", res);
74
75   res = 0; arg = 10;  loop_ne();    printf("res = %d\n", res);
76   res = 0; arg = 500; loop_ne();    printf("res = %d\n", res);
77
78   res = 0; arg = 10;  loop_e();    printf("res = %d\n", res);
79   res = 0; arg = 500; loop_e();    printf("res = %d\n", res);
80
81   return 0;
82}
83