user: What would the C source look like for the assembly code provided here:

```asm
<print_times_table>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  cmpl   $0xf,-0x14(%rbp)
  jg     L55
  cmpl   $0x0,-0x14(%rbp)
  js     L55
  movl   $0x0,-0xc(%rbp)
  jmp    L115
L21:
  movl   $0x0,-0x8(%rbp)
  jmp    L8
L108:
  mov    -0xc(%rbp),%eax
  imul   -0x8(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x8(%rbp)
  je     L78
  mov    $0x2c,%edi
  call   <_putchar@plt>
  mov    $0x20,%edi
  call   <_putchar@plt>
L78:
  cmpl   $0x9,-0x4(%rbp)
  jg     L130
  cmpl   $0x0,-0x8(%rbp)
  je     L130
  mov    $0x20,%edi
  call   <_putchar@plt>
  mov    $0x20,%edi
  call   <_putchar@plt>
  mov    -0x4(%rbp),%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  mov    %edx,%ecx
  sub    %eax,%ecx
  mov    %ecx,%eax
  add    $0x30,%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <_putchar@plt>
  jmp    L159
L130:
  cmpl   $0x9,-0x4(%rbp)
  jle    L86
  cmpl   $0x63,-0x4(%rbp)
  jg     L86
  mov    $0x20,%edi
  call   <_putchar@plt>
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  add    $0x30,%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <_putchar@plt>
  mov    -0x4(%rbp),%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  mov    %edx,%ecx
  sub    %eax,%ecx
  mov    %ecx,%eax
  add    $0x30,%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <_putchar@plt>
  jmp    L159
L86:
  cmpl   $0x63,-0x4(%rbp)
  jle    L127
  cmpl   $0x0,-0x8(%rbp)
  je     L127
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x51eb851f,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x5,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  add    $0x30,%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <_putchar@plt>
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  sub    %eax,%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  mov    %edx,%ecx
  sub    %eax,%ecx
  mov    %ecx,%eax
  add    $0x30,%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <_putchar@plt>
  mov    -0x4(%rbp),%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  mov    %edx,%ecx
  sub    %eax,%ecx
  mov    %ecx,%eax
  add    $0x30,%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <_putchar@plt>
  jmp    L159
L127:
  mov    -0x4(%rbp),%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  mov    %edx,%ecx
  sub    %eax,%ecx
  mov    %ecx,%eax
  add    $0x30,%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <_putchar@plt>
L159:
  addl   $0x1,-0x8(%rbp)
L8:
  mov    -0x8(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jle    L108
  mov    $0xa,%edi
  call   <_putchar@plt>
  addl   $0x1,-0xc(%rbp)
L115:
  mov    -0xc(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jle    L21
L55:
  nop
  leave
  ret
```

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');
    }
  }
}
```