ex.c revision 436e89c602e787e7a27dd6624b09beed41a0da8a
1#include <stdio.h>
2
3char buffer[] ="0123456789abcdef";
4char target[] ="XXXXXXXXXXXXXXXX";
5
6int main(void)
7{
8   setbuf(stdout, NULL);
9
10   printf("------- Copy 10+1 bytes from buffer to target\n");
11   printf("------- EX to OR in the length\n");
12   printf("before: buffer = |%s|\n", buffer);
13   printf("before: target = |%s|\n", target);
14   asm volatile( "larl 1, 1f\n\t"
15                 "lghi 2, 10\n\t"
16                 "ex   2, 0(1)\n\t"
17                 "j    2f\n\t"
18                 "1:\n\t"
19                 "mvc  0(1,%0),0(%1)\n\t"
20                 "2:\n\t"
21                 : : "a" (target), "a" (buffer): "1", "2", "memory");
22   printf("after:  buffer = |%s|\n", buffer);
23   printf("after:  target = |%s|\n", target);
24   printf("\n");
25
26   printf("------- EX 0,... has no effect (writes out target)\n");
27   printf("        target = |");
28   asm volatile( "lghi 0, 0xff\n\t" // fill nonsense in r0
29                 "larl 1, 1f\n\t"
30                 "lghi 2, 1\n\t"    // stdout
31                 "lgr  3, %0\n\t"   // target
32                 "lghi 4, %1\n\t"   // len
33                 "ex   0, 0(1)\n\t"
34                 "j    2f\n\t"
35                 "1:\n\t"
36                 "svc  4\n\t"
37                 "2:\n\t"
38                 : : "a" (target), "i" (sizeof target - 1)
39                 : "0", "1", "2", "3", "4");
40   printf("|\n");
41   printf("\n");
42
43   printf("------- EX to OR in the syscall number (writes out target)\n");
44   printf("        target = |");
45   asm volatile( "lghi 5, 4\n\t"    // NR_write
46                 "larl 1, 1f\n\t"
47                 "lghi 2, 1\n\t"    // stdout
48                 "lgr  3, %0\n\t"   // target
49                 "lghi 4, %1\n\t"   // len
50                 "ex   5, 0(1)\n\t"
51                 "j    2f\n\t"
52                 "1:\n\t"
53                 "svc  0\n\t"       // changed to NR_write
54                 "2:\n\t"
55                 : : "a" (target), "i" (sizeof target - 1)
56                 : "1", "2", "3", "4", "5");
57   printf("|\n");
58   printf("\n");
59
60   return 0;
61}
62
63