Advertisement
filashkov

Untitled

Jan 5th, 2022
885
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.19 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. void
  4. my_test(const char* s, int arg1, int arg2, char arg3, short arg4, int arg5, int arg6)
  5. {
  6.     puts(s);
  7.     printf("%d\n", arg1);
  8.     printf("%d\n", arg2);
  9.     printf("%c\n", arg3);
  10.     printf("%d\n", arg4);
  11.     printf("%d\n", arg5);
  12.     printf("%d\n", arg6);
  13. }
  14.  
  15. int
  16. test_double(const char* s, double arg1, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, double arg8)
  17. {
  18.     //puts(s);
  19.    
  20.     printf("%lf\n", arg1);
  21.     /*printf("%lf\n", arg2);
  22.     printf("%lf\n", arg3);
  23.     printf("%lf\n", arg4);
  24.     printf("%lf\n", arg5);
  25.     printf("%lf\n", arg6);
  26.     printf("%lf\n", arg7);
  27.     printf("%lf\n", arg8);
  28.     */
  29.     return arg1 + arg8;
  30. }
  31.  
  32. int
  33. old_main()
  34. {
  35.     unsigned long long rax_value = 0;
  36.     //unsigned long long args[] = { (unsigned long long)printf, (unsigned long long)"Hi! %d %d %d %d %d %d\n", 1, 2, 3, 4, 5, 48 };
  37.     //unsigned long long args[] = { (unsigned long long)printf, (unsigned long long)"Hi! %d %d %d %d %d %lf\n", 1, 2, 3, 4, 5, (unsigned long long)((double)5.5) };
  38.     //unsigned long long args[] = { (unsigned long long)my_test, (unsigned long long)"Hi! %d %d %d %d %d %d\n", 1, 2, 3, 4, 5, 48 };
  39.     //unsigned long long args[] = { (unsigned long long)printf, (unsigned long long)"Hi! %d %d %d %d %d 1: %lf 2: %lf 3: %lf 4: %lf 5: %lf 6: %lf 7: %lf 8: %lf %lf %lf %lf %lf\n", 1, 2, 3, 4, 5, (unsigned long long)((double)5.5) };
  40.     //unsigned long long args[] = { (unsigned long long)test_double, (unsigned long long)"Hi! %d %d %d %d %d 1: %lf 2: %lf 3: %lf 4: %lf 5: %lf 6: %lf 7: %lf 8: %lf %lf %lf %lf %lf\n", 1, 2, 3, 4, 5, (unsigned long long)((double)5.5) };
  41.     //unsigned long long args[] = { 0, (unsigned long long)printf, (unsigned long long)"Hi! %d %d %d %d %d %d\n", 1, 2, 3, 4, 5, 48 };
  42.     //unsigned long long args[] = { 0, (unsigned long long)printf, (unsigned long long)"Hi! %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", 1, 2, 3, 4, 5, 100, 77, 75, 48, 56, 64, 12, 75, 77 };
  43.     //unsigned long long args[] = { 0, (unsigned long long)printf, (unsigned long long)"Hi! %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n", 1, 2, 3, 4, 5, 100, 77, 75, 48, 56, 64, 12, 75, 77 };
  44.     unsigned long long args_row[] = { 4684295950315513862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
  45.         0, (unsigned long long)printf, (unsigned long long)"Hi! double = %lf %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", 1, 2, 3, 4, 5, 111, 100, 77, 75, 48, 56, 64, 12, 75, 77 };
  46.     unsigned long long* args = args_row + 2 * 8 + 1;
  47.     long long additional_args_quantity = sizeof(args_row) / sizeof(*args_row) - 2 * 8 - 1 - 1 - 1 - 6;
  48.     if (additional_args_quantity < 0) {
  49.         additional_args_quantity = 0;
  50.     }
  51.     args[0] = additional_args_quantity; // Количество дополнительных аргументов, которые пойдут на стек
  52.     printf("args[0] = %llu\n", args[0]);
  53.     asm volatile(
  54.         "movsd -136(%%rax), %%xmm0;"
  55.         "movsd -120(%%rax), %%xmm1;"
  56.         "movsd -104(%%rax), %%xmm2;"
  57.         "movsd -88(%%rax), %%xmm3;"
  58.         "movsd -72(%%rax), %%xmm4;"
  59.         "movsd -56(%%rax), %%xmm5;"
  60.         "movsd -40(%%rax), %%xmm6;"
  61.         "movsd -24(%%rax), %%xmm7;"
  62.         "mov $0, %%rdi;"
  63.         //"pushq %%rax;"
  64.         "for_begin_label:"
  65.             "cmpq %%rdi, (%%rax);"
  66.                 "jna for_end_label;"
  67.                     "pushq 64(%%rax, %%rdi, 8);"
  68.                      //"pushq $42;"
  69.                     "add $1, %%rdi;"
  70.             "jmp for_begin_label;"
  71.         "for_end_label:"
  72.         //"mov %%rsp, %%rsi;"
  73.         "mov 16(%%rax), %%rdi;"
  74.         "movq 24(%%rax), %%rsi;"
  75.         "movq 32(%%rax), %%rdx;"
  76.         "movq 40(%%rax), %%rcx;"
  77.         "movq 48(%%rax), %%r8;"
  78.         "movq 56(%%rax), %%r9;"
  79.         "movq %%rax, %%rbx;"
  80.         "addq $8, %%rbx;"
  81.         "mov -8(%%rax), %%rax;"
  82.         /*"notq %%mm0;"*/
  83.         /*"pcmpeqd %%xmm0, %%xmm0;"*/
  84.         "call *(%%rbx);"
  85.         "subq $8, %%rbx;"
  86.         "movq (%%rbx), %%rbx;"
  87.         "shlq $3, %%rbx;"
  88.         "add %%rbx, %%rsp;"
  89.         //"popq %%rbx;"
  90.         : "=a"(rax_value)
  91.         : "a"(args)
  92.         : "rbx"
  93.     );
  94.     printf("Out: %lld\n", rax_value);
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement