1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar buffer[] ="0123456789abcdef";
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar target[] ="XXXXXXXXXXXXXXXX";
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main(void)
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   setbuf(stdout, NULL);
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("------- Copy 10+1 bytes from buffer to target\n");
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("------- EX to OR in the length\n");
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("before: buffer = |%s|\n", buffer);
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("before: target = |%s|\n", target);
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "larl 1, 1f\n\t"
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 2, 10\n\t"
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "ex   2, 0(1)\n\t"
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j    2f\n\t"
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "1:\n\t"
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "mvc  0(1,%0),0(%1)\n\t"
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "2:\n\t"
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : : "a" (target), "a" (buffer): "1", "2", "memory");
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("after:  buffer = |%s|\n", buffer);
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("after:  target = |%s|\n", target);
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("------- EX 0,... has no effect (writes out target)\n");
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("        target = |");
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lghi 0, 0xff\n\t" // fill nonsense in r0
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "larl 1, 1f\n\t"
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 2, 1\n\t"    // stdout
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lgr  3, %0\n\t"   // target
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 4, %1\n\t"   // len
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "ex   0, 0(1)\n\t"
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j    2f\n\t"
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "1:\n\t"
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "svc  4\n\t"
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "2:\n\t"
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : : "a" (target), "i" (sizeof target - 1)
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "0", "1", "2", "3", "4");
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("|\n");
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("------- EX to OR in the syscall number (writes out target)\n");
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("        target = |");
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lghi 5, 4\n\t"    // NR_write
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "larl 1, 1f\n\t"
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 2, 1\n\t"    // stdout
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lgr  3, %0\n\t"   // target
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 4, %1\n\t"   // len
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "ex   5, 0(1)\n\t"
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j    2f\n\t"
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "1:\n\t"
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "svc  0\n\t"       // changed to NR_write
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "2:\n\t"
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : : "a" (target), "i" (sizeof target - 1)
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "1", "2", "3", "4", "5");
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("|\n");
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
63