#include <stdio.h>
char buffer[] ="0123456789abcdef";
char target[] ="XXXXXXXXXXXXXXXX";
int main(void)
{
setbuf(stdout, NULL);
printf("------- Copy 10+1 bytes from buffer to target\n");
printf("------- EX to OR in the length\n");
printf("before: buffer = |%s|\n", buffer);
printf("before: target = |%s|\n", target);
asm volatile( "larl 1, 1f\n\t"
"lghi 2, 10\n\t"
"ex 2, 0(1)\n\t"
"j 2f\n\t"
"1:\n\t"
"mvc 0(1,%0),0(%1)\n\t"
"2:\n\t"
: : "a" (target), "a" (buffer): "1", "2", "memory");
printf("after: buffer = |%s|\n", buffer);
printf("after: target = |%s|\n", target);
printf("\n");
printf("------- EX 0,... has no effect (writes out target)\n");
printf(" target = |");
asm volatile( "lghi 0, 0xff\n\t" // fill nonsense in r0
"larl 1, 1f\n\t"
"lghi 2, 1\n\t" // stdout
"lgr 3, %0\n\t" // target
"lghi 4, %1\n\t" // len
"ex 0, 0(1)\n\t"
"j 2f\n\t"
"1:\n\t"
"svc 4\n\t"
"2:\n\t"
: : "a" (target), "i" (sizeof target - 1)
: "0", "1", "2", "3", "4");
printf("|\n");
printf("\n");
printf("------- EX to OR in the syscall number (writes out target)\n");
printf(" target = |");
asm volatile( "lghi 5, 4\n\t" // NR_write
"larl 1, 1f\n\t"
"lghi 2, 1\n\t" // stdout
"lgr 3, %0\n\t" // target
"lghi 4, %1\n\t" // len
"ex 5, 0(1)\n\t"
"j 2f\n\t"
"1:\n\t"
"svc 0\n\t" // changed to NR_write
"2:\n\t"
: : "a" (target), "i" (sizeof target - 1)
: "1", "2", "3", "4", "5");
printf("|\n");
printf("\n");
return 0;
}