user: 请从给定的汇编指令推导出C源代码：

```asm
<compact_int>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  movl   $0x0,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x40(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x40(%rbp),%rax
  mov    (%rax),%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x2c(%rbp)
  movl   $0x2,-0x20(%rbp)
  jmp    L36
L3:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    -0x20(%rbp),%edx
  movslq %edx,%rdx
  shl    $0x2,%rdx
  lea    -0x4(%rdx),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rdx),%edx
  sub    %edx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    -0x20(%rbp),%edx
  movslq %edx,%rdx
  shl    $0x2,%rdx
  lea    -0x4(%rdx),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rdx),%edx
  sub    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  sub    -0x30(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <ABS@plt>
  mov    %eax,%ebx
  mov    -0x14(%rbp),%eax
  sub    -0x2c(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <ABS@plt>
  add    %ebx,%eax
  test   %eax,%eax
  jne    L33
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  je     L30
L33:
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x48(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x24(%rbp)
  mov    -0x20(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x28(%rbp)
  je     L35
  mov    -0x20(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x20(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x20(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x48(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x24(%rbp)
L35:
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x18(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x14(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
L30:
  addl   $0x1,-0x20(%rbp)
L36:
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x20(%rbp)
  jl     L3
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x48(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x24(%rbp)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x50(%rbp),%rax
  mov    -0x24(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x1c(%rbp),%eax
  sub    %edx,%eax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int compact_int(xp, yp, isa_move, size)
int xp[], yp[], isa_move[], *size;
{
  int dx, dy, old_dx, old_dy, start, index, i, old_size;
  start = index = 0;
  old_dx = xp[1] - xp[0];
  old_dy = yp[1] - yp[0];
  for (i = 2; i < *size; i++) {
    dx = xp[i] - xp[i - 1];
    dy = yp[i] - yp[i - 1];
    if ((ABS(dx - old_dx) + ABS(dy - old_dy) != 0) || (isa_move[i])) {
      xp[index] = xp[start];
      yp[index] = yp[start];
      isa_move[index] = isa_move[start];
      index++;
      if (start != i - 1) {
        xp[index] = xp[i - 1];
        yp[index] = yp[i - 1];
        isa_move[index] = isa_move[i - 1];
        index++;
      }
      start = i;
      old_dx = dx;
      old_dy = dy;
    }
  }
  xp[index] = xp[*size - 1];
  yp[index] = yp[*size - 1];
  isa_move[index] = isa_move[*size - 1];
  index++;
  old_size = *size;
  *size = index;
  return (old_size - *size);
}
```