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