mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
63 lines
2.0 KiB
C
63 lines
2.0 KiB
C
#include <stdio.h>
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
|
|
char buffer[] = "0123456789abcdefXXXXX";
|
|
char target[] = "---------------------";
|
|
char overlap[]= "012345678901234567890";
|
|
char full[300];
|
|
|
|
int main(void)
|
|
{
|
|
int i;
|
|
|
|
/* Normal copy */
|
|
printf("------- Copy 17 bytes from BUFFER to TARGET\n");
|
|
printf("before: buffer = |%s|\n", buffer);
|
|
printf("before: target = |%s|\n", target);
|
|
asm volatile( "mvc 0(17,%0),0(%1)\n"
|
|
::"a" (target),"a" (buffer): "memory");
|
|
printf("after: buffer = |%s|\n", buffer);
|
|
printf("after: target = |%s|\n", target);
|
|
printf("\n");
|
|
|
|
/* Destructive overlap #1 */
|
|
printf("------- Destructive overlap #1\n");
|
|
printf("before: |%s|\n", overlap);
|
|
asm volatile( "mvc 1(17,%0),0(%1)\n"
|
|
::"a" (overlap),"a" (overlap): "memory");
|
|
printf("after: |%s|\n", overlap);
|
|
|
|
/* Destructive overlap #2 */
|
|
printf("------- Destructive overlap #2\n");
|
|
memset(target, '-', sizeof target - 1); // restore initial state
|
|
printf("before: target = |%s|\n", target);
|
|
asm volatile( "mvi 0(%0),'x'\n\t" // target[1] = 'x'
|
|
"mvc 1(2,%0),0(%0)\n\t" // target[2:3] = target[1]
|
|
:: "a" (target+1));
|
|
printf("after: target = |%s|\n", target);
|
|
|
|
/* Destructive overlap #3 */
|
|
printf("------- Destructive overlap #3 (max length)\n");
|
|
memset(full, '-', sizeof full);
|
|
full[0] = 'x';
|
|
asm volatile( "mvc 1(256,%0),0(%0)\n\t" // full[1:256] = full[0]
|
|
:: "a" (full));
|
|
/* Verify: the first 256+1 characters should be 'x' followed by '-' */
|
|
for (i = 0; i <= 256; ++i)
|
|
assert(full[i] == 'x');
|
|
for ( ; i < sizeof full; ++i)
|
|
assert(full[i] == '-');
|
|
printf("\n");
|
|
|
|
/* Non-destructive overlap */
|
|
printf("------- Non-destructive overlap buf[0:4] = buf[10:14]\n");
|
|
char buf[] = "0123456789abcde";
|
|
printf("before: buf = |%s|\n", buf);
|
|
asm volatile( "mvc 0(5,%0),10(%1)\n"
|
|
::"a" (buf),"a" (buf): "memory");
|
|
printf("after: buf = |%s|\n", buf);
|
|
|
|
return 0;
|
|
}
|