zhukov000

C + Asm

Jan 11th, 2020
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.15 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. short assembler(char px, short py, char pz)
  4. {
  5.   int x = px, y = py, z = pz;
  6.   __asm__ ( "addl $7, %%eax;"     // eax += 7
  7.             "imul $7, %%eax;"     // eax *= 7
  8.             "subl %%ebx, %%eax;"  // eax -= ebx
  9.             "imul $3, %%ecx;"     // ecx *= 3
  10.             "subl $1, %%ecx;"     // ecx -= 1
  11.             "movl $0, %%edx;"     // edx = 0
  12.             "idivl %%ecx;"        // edx:eax / ecx => eax
  13.             "addl $2, %%eax;"     // eax += 2
  14.             : "=a" (x) : "c" (x) , "b" (y), "a" (z) );
  15.             /*
  16.               Input: z => eax, y => ebx, x => ecx
  17.               Output: eax => x
  18.             */
  19.   return x;
  20. }
  21.  
  22. void print(short v_as)
  23. {
  24.   printf("\tat 10: %d,\tat 16: %s%x\n", v_as, v_as < 0 ? "-": "", v_as < 0 ? -(unsigned)v_as : v_as );
  25. }
  26.  
  27. void solve(char x, short y, char z, short v)
  28. {
  29.   short v_c = (7 * (z + 7) - y) / (3 * x - 1) + 2;
  30.   short v_as = assembler(x, y, z);
  31.   printf("\n<<Assembler>>"); print(v_as);
  32.   printf("<<True answer>>"); print(v);
  33.   printf("<<C>>\t"); print(v_c);
  34. }
  35.  
  36. int main()
  37. {
  38.   solve(0x1, 0x1, -0x8, -0x2);
  39.   solve(-0x6B, -0x3CF4, 0x74, -0x31);
  40.   return 0;
  41. }
Add Comment
Please, Sign In to add comment