user: Translate the below assembly code into C programming language:

```asm
<ExplodeBox1>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %edi,0xc(%rsp)
  mov    %esi,0x10(%rsp)
  mov    %edx,0x14(%rsp)
  mov    %ecx,0x18(%rsp)
  mov    %edx,%eax
  add    %edi,%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %eax,%edx
  sar    %edx
  mov    %edx,%r14d
  lea    -0x1(%rdx),%r12d
  mov    %ecx,%eax
  add    %esi,%eax
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
  mov    %ecx,%r15d
  lea    -0x1(%rcx),%r13d
  mov    %r13d,%esi
  mov    %r12d,%edi
  call   <XDrawBox1@plt>
  mov    $0x1b58,%ebx
  movl   $0x0,0x8(%rsp)
  jmp    L112
L103:
  add    $0x1,%ebp
  jmp    L61
L10:
  add    $0x1,%ebp
  jmp    L109
L7:
  add    $0x1,%ebp
  test   %ebx,%ebx
  jle    L17
L28:
  mov    $0x0,%eax
L43:
  add    $0x1,%eax
  cmp    %ebx,%eax
  jl     L43
L17:
  lea    -0x1(%r15),%ecx
  lea    -0x1(%r14),%edx
  lea    0x1(%r13),%esi
  lea    0x1(%r12),%edi
  call   <BlockErase@plt>
  mov    %r15d,%ecx
  mov    %r14d,%edx
  mov    %r13d,%esi
  mov    %r12d,%edi
  call   <XDrawBox1@plt>
  cmp    $0x3,%ebp
  jg     L95
L11:
  sub    $0x2bc,%ebx
L112:
  cmpl   $0x1,0x8(%rsp)
  setne  %al
  setne  %sil
  movzbl %sil,%esi
  mov    %esi,0x8(%rsp)
  mov    $0x1,%ebp
  cmp    %r12d,0xc(%rsp)
  jge    L78
  sub    $0x1,%r12d
  mov    $0x0,%ebp
L78:
  cmp    %r14d,0x14(%rsp)
  jle    L103
  add    $0x1,%r14d
L61:
  cmp    %r13d,0x10(%rsp)
  jge    L10
  test   %al,%al
  je     L10
  sub    $0x1,%r13d
L109:
  cmp    %r15d,0x18(%rsp)
  jle    L7
  test   %al,%al
  je     L7
  lea    0x1(%r15),%eax
  mov    %eax,0x1c(%rsp)
  test   %ebx,%ebx
  jle    L116
  mov    0x1c(%rsp),%r15d
  jmp    L28
L95:
  mov    0x18(%rsp),%ebp
  mov    %ebp,%ecx
  mov    0x14(%rsp),%r15d
  mov    %r15d,%edx
  mov    0x10(%rsp),%r14d
  mov    %r14d,%esi
  mov    0xc(%rsp),%ebx
  mov    %ebx,%edi
  call   <BlockErase@plt>
  mov    %ebp,%ecx
  mov    %r15d,%edx
  mov    %r14d,%esi
  mov    %ebx,%edi
  call   <XDrawBox1@plt>
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L116:
  lea    -0x1(%r14),%edx
  lea    0x1(%r13),%esi
  lea    0x1(%r12),%edi
  mov    %r15d,%ecx
  call   <BlockErase@plt>
  mov    0x1c(%rsp),%r15d
  mov    %r15d,%ecx
  mov    %r14d,%edx
  mov    %r13d,%esi
  mov    %r12d,%edi
  call   <XDrawBox1@plt>
  jmp    L11
```

assistant: ```c
void ExplodeBox1(int x, int y, int xx, int yy) {
  register int i;
  int midx1, midy1, midx2, midy2;
  int num = 0;
  int flag;
  int Inc = 7000;
  midx1 = (xx + x) / 2 - 1;
  midy1 = (yy + y) / 2 - 1;
  midx2 = midx1 + 1;
  midy2 = midy1 + 1;
  XDrawBox1(midx1, midy1, midx2, midy2);
  flag = 0;
  while (num < 4) {
    num = 0;
    if (flag == 1)
      flag = 0;
    else
      flag = 1;
    if (midx1 > x)
      midx1--;
    else
      num++;
    if (midx2 < xx)
      midx2++;
    else
      num++;
    if (midy1 > y && flag > 0)
      midy1--;
    else
      num++;
    if (midy2 < yy && flag > 0)
      midy2++;
    else
      num++;
    for (i = 0; i < Inc; ++i)
      ;
    Inc -= 700;
    BlockErase(midx1 + 1, midy1 + 1, midx2 - 1, midy2 - 1);
    XDrawBox1(midx1, midy1, midx2, midy2);
  }
  BlockErase(x, y, xx, yy);
  XDrawBox1(x, y, xx, yy);
}
```