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

```asm
<print_times_table>:
  endbr64
  cmp    $0xf,%edi
  ja     L2
  push   %r15
  mov    $0xcccccccd,%r15d
  push   %r14
  lea    0x1(%rdi),%r14d
  push   %r13
  xor    %r13d,%r13d
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  nopl   0x0(%rax,%rax,1)
L79:
  xor    %ebx,%ebx
  xor    %r12d,%r12d
  jmp    L76
  nopw   0x0(%rax,%rax,1)
L51:
  mov    %ebx,%eax
  mov    %ebx,%ebp
  imul   %r15,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%ebp
  add    $0x30,%ebp
  movzbl %bpl,%ebp
L24:
  mov    %ebp,%edi
  call   <_putchar@plt>
L103:
  lea    0x1(%r12),%eax
  add    %r13d,%ebx
  cmp    %eax,%r14d
  je     L87
L86:
  mov    %eax,%r12d
L76:
  test   %r12d,%r12d
  je     L51
  mov    $0x2c,%edi
  call   <_putchar@plt>
  mov    $0x20,%edi
  call   <_putchar@plt>
  cmp    $0x9,%ebx
  jg     L71
  mov    $0x20,%edi
  call   <_putchar@plt>
  mov    $0x20,%edi
  call   <_putchar@plt>
  lea    0x30(%rbx),%edi
  add    %r13d,%ebx
  movzbl %dil,%edi
  call   <_putchar@plt>
  lea    0x1(%r12),%eax
  cmp    %eax,%r14d
  jne    L86
L87:
  mov    $0xa,%edi
  call   <_putchar@plt>
  lea    0x1(%r13),%eax
  cmp    %r12d,%r13d
  je     L8
  mov    %eax,%r13d
  jmp    L79
  nopw   0x0(%rax,%rax,1)
L71:
  mov    %ebx,%eax
  mov    %ebx,%ebp
  mov    %rax,%rdx
  imul   %r15,%rdx
  shr    $0x23,%rdx
  lea    (%rdx,%rdx,4),%ecx
  add    %ecx,%ecx
  sub    %ecx,%ebp
  lea    -0xa(%rbx),%ecx
  add    $0x30,%ebp
  movzbl %bpl,%ebp
  cmp    $0x59,%ecx
  ja     L78
  mov    $0x20,%edi
  mov    %edx,0xc(%rsp)
  call   <_putchar@plt>
  mov    0xc(%rsp),%edx
  add    $0x30,%edx
  movzbl %dl,%edi
  call   <_putchar@plt>
  mov    %ebp,%edi
  call   <_putchar@plt>
  jmp    L103
  xchg   %ax,%ax
L2:
  ret
  nopl   0x0(%rax)
L8:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L78:
  cmp    $0x63,%ebx
  jle    L24
  imul   $0x51eb851f,%rax,%rdi
  mov    %edx,0xc(%rsp)
  shr    $0x25,%rdi
  add    $0x30,%edi
  movzbl %dil,%edi
  call   <_putchar@plt>
  mov    0xc(%rsp),%eax
  mov    %rax,%rdx
  imul   %r15,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%edx
  lea    0x30(%rdx),%edi
  movzbl %dil,%edi
  call   <_putchar@plt>
  mov    %ebp,%edi
  call   <_putchar@plt>
  jmp    L103
```

assistant: ```c
void print_times_table(int n) {
  int i, j, total;
  if (!(n > 15 || n < 0)) {
    for (i = 0; i <= n; i++) {
      for (j = 0; j <= n; j++) {
        total = (i * j);
        if (j != 0) {
          _putchar(',');
          _putchar(' ');
        }
        if (total < 10 && j != 0) {
          _putchar(' ');
          _putchar(' ');
          _putchar((total % 10) + '0');
        } else if (total >= 10 && total < 100) {
          _putchar(' ');
          _putchar((total / 10) + '0');
          _putchar((total % 10) + '0');
        } else if (total >= 100 && j != 0) {
          _putchar((total / 100) + '0');
          _putchar((total / 10) % 10 + '0');
          _putchar((total % 10) + '0');
        } else
          _putchar((total % 10) + '0');
      }
      _putchar('\n');
    }
  }
}
```