| #include <features.h> |
| #include <signal.h> |
| #include <sys/types.h> |
| #include <pthread.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| |
| char source[40] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\0"; |
| char target[40] = " \0"; |
| |
| pthread_t thread; |
| |
| void *threadfunc(void *arg) |
| { |
| char buf2[40]; |
| int i; |
| |
| memset(buf2, 0, sizeof(buf2)); |
| for (i=0; i<5000; i++) |
| asm volatile( |
| "lghi 2,0\n" |
| "lghi 3,0\n" |
| "lgr 4,%0\n" |
| "lgr 5,%1\n" |
| "larl 1,1f\n" |
| "0: ex 0,0(1)\n" |
| "j 2f\n" |
| "1: mvc 0(30,4),0(5)\n" |
| "2:\n" |
| ::"a" (buf2), "a" (source) |
| : "1", "2", "3", "4", "5", "memory"); |
| printf("%s\n", buf2); |
| pthread_exit(0); |
| } |
| |
| int main() |
| { |
| int i; |
| |
| pthread_create(&thread, NULL, threadfunc, NULL); |
| |
| for (i=0; i<5000; i++) |
| asm volatile( |
| "lghi 4,0\n" |
| "lghi 5,0\n" |
| "lgr 2,%0\n" |
| "lgr 3,%1\n" |
| "larl 1,1f\n" |
| "0: ex 0,0(1)\n" |
| "j 2f\n" |
| "1: mvc 0(20,2),0(3)\n" |
| "2:\n" |
| ::"a" (target), "a" (source) |
| : "1", "2", "3", "4", "5", "memory"); |
| pthread_join(thread, NULL); |
| printf("%s\n", target); |
| pthread_exit(0); |
| } |