1 #include <stdio.h> 2 #include <assert.h> 3 #include <string.h> 4 5 char buffer[] = "0123456789abcdefXXXXX"; 6 char target[] = "---------------------"; 7 char overlap[]= "012345678901234567890"; 8 char full[300]; 9 10 int main(void) 11 { 12 int i; 13 14 /* Normal copy */ 15 printf("------- Copy 17 bytes from BUFFER to TARGET\n"); 16 printf("before: buffer = |%s|\n", buffer); 17 printf("before: target = |%s|\n", target); 18 asm volatile( "mvc 0(17,%0),0(%1)\n" 19 ::"a" (target),"a" (buffer): "memory"); 20 printf("after: buffer = |%s|\n", buffer); 21 printf("after: target = |%s|\n", target); 22 printf("\n"); 23 24 /* Destructive overlap #1 */ 25 printf("------- Destructive overlap #1\n"); 26 printf("before: |%s|\n", overlap); 27 asm volatile( "mvc 1(17,%0),0(%1)\n" 28 ::"a" (overlap),"a" (overlap): "memory"); 29 printf("after: |%s|\n", overlap); 30 31 /* Destructive overlap #2 */ 32 printf("------- Destructive overlap #2\n"); 33 memset(target, '-', sizeof target - 1); // restore initial state 34 printf("before: target = |%s|\n", target); 35 asm volatile( "mvi 0(%0),'x'\n\t" // target[1] = 'x' 36 "mvc 1(2,%0),0(%0)\n\t" // target[2:3] = target[1] 37 :: "a" (target+1)); 38 printf("after: target = |%s|\n", target); 39 40 /* Destructive overlap #3 */ 41 printf("------- Destructive overlap #3 (max length)\n"); 42 memset(full, '-', sizeof full); 43 full[0] = 'x'; 44 asm volatile( "mvc 1(256,%0),0(%0)\n\t" // full[1:256] = full[0] 45 :: "a" (full)); 46 /* Verify: the first 256+1 characters should be 'x' followed by '-' */ 47 for (i = 0; i <= 256; ++i) 48 assert(full[i] == 'x'); 49 for ( ; i < sizeof full; ++i) 50 assert(full[i] == '-'); 51 printf("\n"); 52 53 /* Non-destructive overlap */ 54 printf("------- Non-destructive overlap buf[0:4] = buf[10:14]\n"); 55 char buf[] = "0123456789abcde"; 56 printf("before: buf = |%s|\n", buf); 57 asm volatile( "mvc 0(5,%0),10(%1)\n" 58 ::"a" (buf),"a" (buf): "memory"); 59 printf("after: buf = |%s|\n", buf); 60 61 return 0; 62 } 63