1 #include <stdio.h> 2 3 char buffer[] ="0123456789abcdef"; 4 char target[] ="XXXXXXXXXXXXXXXX"; 5 6 int 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