user: Converte this assembly snippet into its equivalent C code:

```asm
<multiplication>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xd0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xc8(%rsp)
  xor    %eax,%eax
  movl   $0x1,(%rsp)
  movl   $0x1,0x4(%rsp)
  movl   $0x1,0x8(%rsp)
  movl   $0x1,0xc(%rsp)
  movl   $0x2,0x10(%rsp)
  movl   $0x2,0x14(%rsp)
  movl   $0x2,0x18(%rsp)
  movl   $0x2,0x1c(%rsp)
  movl   $0x3,0x20(%rsp)
  movl   $0x3,0x24(%rsp)
  movl   $0x3,0x28(%rsp)
  movl   $0x3,0x2c(%rsp)
  movl   $0x4,0x30(%rsp)
  movl   $0x4,0x34(%rsp)
  movl   $0x4,0x38(%rsp)
  movl   $0x4,0x3c(%rsp)
  movl   $0x1,0x40(%rsp)
  movl   $0x1,0x44(%rsp)
  movl   $0x1,0x48(%rsp)
  movl   $0x1,0x4c(%rsp)
  movl   $0x2,0x50(%rsp)
  movl   $0x2,0x54(%rsp)
  movl   $0x2,0x58(%rsp)
  movl   $0x2,0x5c(%rsp)
  movl   $0x3,0x60(%rsp)
  movl   $0x3,0x64(%rsp)
  movl   $0x3,0x68(%rsp)
  movl   $0x3,0x6c(%rsp)
  movl   $0x4,0x70(%rsp)
  movl   $0x4,0x74(%rsp)
  movl   $0x4,0x78(%rsp)
  movl   $0x4,0x7c(%rsp)
  lea    0x80(%rsp),%r11
  lea    0xc0(%rsp),%r9
  mov    %r11,%rax
L47:
  movl   $0x0,(%rax)
  movl   $0x0,0x4(%rax)
  movl   $0x0,0x8(%rax)
  movl   $0x0,0xc(%rax)
  add    $0x10,%rax
  cmp    %r9,%rax
  jne    L47
  mov    $0xf4240,%r10d
  lea    0x40(%rsp),%r8
  lea    0x50(%rsp),%rsi
  jmp    L101
L93:
  mov    %ecx,0x0(%r13)
  add    $0x4,%r12
  add    $0x4,%rbx
  cmp    %rsi,%rbx
  je     L40
L34:
  mov    %r12,%r13
  mov    (%r12),%ecx
  mov    $0x0,%eax
L15:
  mov    %rax,%rdx
  shl    $0x4,%rdx
  mov    (%rbx,%rdx,1),%edx
  imul   0x0(%rbp,%rax,4),%edx
  add    %edx,%ecx
  add    $0x1,%rax
  cmp    $0x4,%rax
  jne    L15
  jmp    L93
L40:
  add    $0x10,%rbp
  add    $0x10,%r14
  cmp    %r8,%rbp
  je     L155
L49:
  mov    %r8,%rbx
  mov    %r14,%r12
  jmp    L34
L106:
  mov    %ecx,0x0(%r13)
  add    $0x4,%r12
  add    $0x4,%rbx
  cmp    %rsi,%rbx
  je     L1
L61:
  mov    %r12,%r13
  mov    (%r12),%ecx
  mov    $0x0,%eax
L83:
  mov    %rax,%rdx
  shl    $0x4,%rdx
  mov    (%rbx,%rdx,1),%edx
  imul   0x0(%rbp,%rax,4),%edx
  add    %edx,%ecx
  add    $0x1,%rax
  cmp    $0x4,%rax
  jne    L83
  jmp    L106
L1:
  add    $0x10,%rbp
  add    $0x10,%rdi
  cmp    %r9,%rbp
  je     L117
L65:
  mov    %r8,%rbx
  mov    %rdi,%r12
  jmp    L61
L155:
  mov    %r11,%rbp
  jmp    L65
L117:
  sub    $0x1,%r10d
  je     L142
L101:
  mov    %rsp,%rdi
  mov    %r11,%r14
  mov    %rdi,%rbp
  jmp    L49
L142:
  mov    $0x0,%eax
L108:
  add    (%r11),%eax
  add    0x4(%r11),%eax
  add    0x8(%r11),%eax
  add    0xc(%r11),%eax
  add    $0x10,%r11
  cmp    %r9,%r11
  jne    L108
  mov    0xc8(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L94
  add    $0xd0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L94:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int multiplication() {
  int mat1[4][4] = {{1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4}};
  int mat2[4][4] = {{1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4}};
  int res[4][4];
  int i, j, k;
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
      res[i][j] = 0;
    }
  }
  int z;
  for (z = 0; z < 1000000; ++z) {
    for (i = 0; i < 4; i++) {
      for (j = 0; j < 4; j++) {
        for (k = 0; k < 4; k++)
          res[i][j] += mat1[i][k] * mat2[k][j];
      }
    }
    for (i = 0; i < 4; i++) {
      for (j = 0; j < 4; j++) {
        for (k = 0; k < 4; k++)
          mat1[i][j] += res[i][k] * mat2[k][j];
      }
    }
  }
  int r = 0;
  for (j = 0; j < 4; j++) {
    for (k = 0; k < 4; k++)
      r += res[j][k];
  }
  return r;
}
```