mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
60 lines
2.0 KiB
C
60 lines
2.0 KiB
C
#include <stdio.h>
|
|
|
|
char buffer[] ="0123456789abcdef";
|
|
char target[] ="XXXXXXXXXXXXXXXX";
|
|
|
|
int main(void)
|
|
{
|
|
setbuf(stdout, NULL);
|
|
|
|
printf("------- Copy 10+1 bytes from buffer to target\n");
|
|
printf("------- EXRL to OR in the length\n");
|
|
printf("before: buffer = |%s|\n", buffer);
|
|
printf("before: target = |%s|\n", target);
|
|
asm volatile( "lghi 2, 10\n\t"
|
|
".insn ril,0xc60000000000,2,1f\n\t" // exrl 2, 1f
|
|
"j 2f\n\t"
|
|
"1:\n\t"
|
|
"mvc 0(1,%0),0(%1)\n\t"
|
|
"2:\n\t"
|
|
: : "a" (target), "a" (buffer) : "1", "2", "memory");
|
|
printf("after: buffer = |%s|\n", buffer);
|
|
printf("after: target = |%s|\n", target);
|
|
printf("\n");
|
|
|
|
printf("------- EXRL 0,... has no effect (writes out target)\n");
|
|
printf(" target = |");
|
|
asm volatile( "lghi 0, 0xff\n\t" // fill nonsense in r0
|
|
"lghi 2, 1\n\t" // stdout
|
|
"lgr 3, %0\n\t" // target
|
|
"lghi 4, %1\n\t" // len
|
|
".insn ril,0xc60000000000,0,1f\n\t" // exrl 0, 1f
|
|
"j 2f\n\t"
|
|
"1:\n\t"
|
|
"svc 4\n\t" // NR_write
|
|
"2:\n\t"
|
|
: : "a" (target), "i" (sizeof target - 1)
|
|
: "0", "2", "3", "4");
|
|
printf("|\n");
|
|
printf("\n");
|
|
|
|
printf("------- EXRL to OR in the syscall number (writes out target)\n");
|
|
printf(" target = |");
|
|
asm volatile( "lghi 1, 4\n\t" // NR_write
|
|
"lghi 2, 1\n\t" // stdout
|
|
"lgr 3, %0\n\t" // target
|
|
"lghi 4, %1\n\t" // len
|
|
".insn ril,0xc60000000000,1,1f\n\t" // exrl 1, 1f
|
|
"j 2f\n\t"
|
|
"1:\n\t"
|
|
"svc 0\n\t" // changed to NR_write
|
|
"2:\n\t"
|
|
: : "a" (target), "i" (sizeof target - 1)
|
|
: "1", "2", "3", "4");
|
|
printf("|\n");
|
|
printf("\n");
|
|
|
|
return 0;
|
|
}
|
|
|