1 #include <unistd.h> 2 3 char base[] ="0123456789012345678901234567890123456789"; 4 5 void 6 stmg_no_wrap(void) 7 { 8 char buf[24]; 9 10 /* No-wrap around case; copies 24 bytes from BASE to BUF */ 11 asm volatile( "lg 5, 0(%1)\n\t" 12 "lg 6, 8(%1)\n\t" 13 "lg 7, 16(%1)\n\t" 14 "stmg 5, 7, %0\n\t" 15 :"=m" (buf) 16 : "a" (base) 17 : "5", "6", "7"); 18 /* Write out BUF */ 19 asm volatile( "lghi 2, 1\n\t" // stdout 20 "lgr 3, %0\n\t" // buf 21 "lghi 4, 24\n\t" // len = 3*8 bytes 22 "svc 4\n\t" 23 : : "a" (buf) 24 : "2", "3", "4"); 25 } 26 27 void 28 stmg_wrap(void) 29 { 30 char buf[64]; 31 32 /* Wrap around case; copies 32 bytes from BASE to BUF */ 33 asm volatile( "lg 15, 0(%1)\n\t" 34 "lg 0, 8(%1)\n\t" 35 "lg 1, 16(%1)\n\t" 36 "lg 2, 24(%1)\n\t" 37 "stmg 15, 2, %0\n\t" 38 :"=m" (buf) 39 : "a" (base) 40 : "15", "0", "1", "2"); 41 /* Write out BUF */ 42 asm volatile( "lghi 2, 1\n\t" // stdout 43 "lgr 3, %0\n\t" // buf 44 "lghi 4, 32\n\t" // len = 4*8 bytes 45 "svc 4\n\t" 46 : : "a" (buf) 47 : "2", "3", "4"); 48 } 49 50 51 int main(void) 52 { 53 stmg_no_wrap(); 54 write(1, "\n", 1); 55 stmg_wrap(); 56 write(1, "\n", 1); 57 58 return 0; 59 } 60