user: Please show me the C implementation that matches the assembly code listed below:

```asm
<matrix_multiply>:
  endbr64
  movzbl 0x4(%rsi),%eax
  mulb   0x1(%rdi)
  mov    %rsi,%rcx
  mov    %eax,%esi
  movzbl (%rcx),%eax
  mulb   (%rdi)
  add    %eax,%esi
  movzbl 0xc(%rcx),%eax
  mulb   0x3(%rdi)
  add    %eax,%esi
  movzbl 0x8(%rcx),%eax
  mulb   0x2(%rdi)
  add    %eax,%esi
  mov    %sil,(%rdx)
  movzbl 0x5(%rcx),%eax
  mulb   0x1(%rdi)
  mov    %eax,%esi
  movzbl 0x1(%rcx),%eax
  mulb   (%rdi)
  add    %eax,%esi
  movzbl 0xd(%rcx),%eax
  mulb   0x3(%rdi)
  add    %eax,%esi
  movzbl 0x2(%rdi),%eax
  mulb   0x9(%rcx)
  add    %eax,%esi
  mov    %sil,0x1(%rdx)
  movzbl (%rdi),%eax
  mulb   0x2(%rcx)
  mov    %eax,%esi
  movzbl 0x1(%rdi),%eax
  mulb   0x6(%rcx)
  add    %eax,%esi
  movzbl 0x3(%rdi),%eax
  mulb   0xe(%rcx)
  add    %eax,%esi
  movzbl 0x2(%rdi),%eax
  mulb   0xa(%rcx)
  add    %eax,%esi
  mov    %sil,0x2(%rdx)
  movzbl (%rdi),%eax
  mulb   0x3(%rcx)
  mov    %eax,%esi
  movzbl 0x1(%rdi),%eax
  mulb   0x7(%rcx)
  add    %eax,%esi
  movzbl 0x3(%rdi),%eax
  mulb   0xf(%rcx)
  add    %eax,%esi
  movzbl 0x2(%rdi),%eax
  mulb   0xb(%rcx)
  add    %eax,%esi
  mov    %sil,0x3(%rdx)
  movzbl 0x4(%rdi),%eax
  mulb   (%rcx)
  mov    %eax,%esi
  movzbl 0x5(%rdi),%eax
  mulb   0x4(%rcx)
  add    %eax,%esi
  movzbl 0x7(%rdi),%eax
  mulb   0xc(%rcx)
  add    %eax,%esi
  movzbl 0x6(%rdi),%eax
  mulb   0x8(%rcx)
  add    %eax,%esi
  mov    %sil,0x4(%rdx)
  movzbl 0x4(%rdi),%eax
  mulb   0x1(%rcx)
  mov    %eax,%esi
  movzbl 0x5(%rdi),%eax
  mulb   0x5(%rcx)
  add    %eax,%esi
  movzbl 0x7(%rdi),%eax
  mulb   0xd(%rcx)
  add    %eax,%esi
  movzbl 0x6(%rdi),%eax
  mulb   0x9(%rcx)
  add    %eax,%esi
  mov    %sil,0x5(%rdx)
  movzbl 0x4(%rdi),%eax
  mulb   0x2(%rcx)
  mov    %eax,%esi
  movzbl 0x5(%rdi),%eax
  mulb   0x6(%rcx)
  add    %eax,%esi
  movzbl 0x7(%rdi),%eax
  mulb   0xe(%rcx)
  add    %eax,%esi
  movzbl 0x6(%rdi),%eax
  mulb   0xa(%rcx)
  add    %eax,%esi
  mov    %sil,0x6(%rdx)
  movzbl 0x4(%rdi),%eax
  mulb   0x3(%rcx)
  mov    %eax,%esi
  movzbl 0x5(%rdi),%eax
  mulb   0x7(%rcx)
  add    %eax,%esi
  movzbl 0x7(%rdi),%eax
  mulb   0xf(%rcx)
  add    %eax,%esi
  movzbl 0x6(%rdi),%eax
  mulb   0xb(%rcx)
  add    %eax,%esi
  mov    %sil,0x7(%rdx)
  movzbl 0x8(%rdi),%eax
  mulb   (%rcx)
  mov    %eax,%esi
  movzbl 0x9(%rdi),%eax
  mulb   0x4(%rcx)
  add    %eax,%esi
  movzbl 0xb(%rdi),%eax
  mulb   0xc(%rcx)
  add    %eax,%esi
  movzbl 0xa(%rdi),%eax
  mulb   0x8(%rcx)
  add    %eax,%esi
  mov    %sil,0x8(%rdx)
  movzbl 0x8(%rdi),%eax
  mulb   0x1(%rcx)
  mov    %eax,%esi
  movzbl 0x9(%rdi),%eax
  mulb   0x5(%rcx)
  add    %eax,%esi
  movzbl 0xb(%rdi),%eax
  mulb   0xd(%rcx)
  add    %eax,%esi
  movzbl 0xa(%rdi),%eax
  mulb   0x9(%rcx)
  add    %eax,%esi
  mov    %sil,0x9(%rdx)
  movzbl 0x8(%rdi),%eax
  mulb   0x2(%rcx)
  mov    %eax,%esi
  movzbl 0x9(%rdi),%eax
  mulb   0x6(%rcx)
  add    %eax,%esi
  movzbl 0xb(%rdi),%eax
  mulb   0xe(%rcx)
  add    %eax,%esi
  movzbl 0xa(%rdi),%eax
  mulb   0xa(%rcx)
  add    %eax,%esi
  mov    %sil,0xa(%rdx)
  movzbl 0x8(%rdi),%eax
  mulb   0x3(%rcx)
  mov    %eax,%esi
  movzbl 0x9(%rdi),%eax
  mulb   0x7(%rcx)
  add    %eax,%esi
  movzbl 0xb(%rdi),%eax
  mulb   0xf(%rcx)
  add    %eax,%esi
  movzbl 0xa(%rdi),%eax
  mulb   0xb(%rcx)
  add    %eax,%esi
  mov    %sil,0xb(%rdx)
  movzbl 0xc(%rdi),%eax
  mulb   (%rcx)
  mov    %eax,%esi
  movzbl 0xd(%rdi),%eax
  mulb   0x4(%rcx)
  add    %eax,%esi
  movzbl 0xf(%rdi),%eax
  mulb   0xc(%rcx)
  add    %eax,%esi
  movzbl 0xe(%rdi),%eax
  mulb   0x8(%rcx)
  add    %eax,%esi
  mov    %sil,0xc(%rdx)
  movzbl 0xc(%rdi),%eax
  mulb   0x1(%rcx)
  mov    %eax,%esi
  movzbl 0xd(%rdi),%eax
  mulb   0x5(%rcx)
  add    %eax,%esi
  movzbl 0xf(%rdi),%eax
  mulb   0xd(%rcx)
  add    %eax,%esi
  movzbl 0xe(%rdi),%eax
  mulb   0x9(%rcx)
  add    %eax,%esi
  mov    %sil,0xd(%rdx)
  movzbl 0xc(%rdi),%eax
  mulb   0x2(%rcx)
  mov    %eax,%esi
  movzbl 0xd(%rdi),%eax
  mulb   0x6(%rcx)
  add    %eax,%esi
  movzbl 0xf(%rdi),%eax
  mulb   0xe(%rcx)
  add    %eax,%esi
  movzbl 0xe(%rdi),%eax
  mulb   0xa(%rcx)
  add    %eax,%esi
  mov    %sil,0xe(%rdx)
  movzbl 0xc(%rdi),%eax
  mulb   0x3(%rcx)
  mov    %eax,%esi
  movzbl 0xd(%rdi),%eax
  mulb   0x7(%rcx)
  add    %eax,%esi
  movzbl 0xf(%rdi),%eax
  mulb   0xf(%rcx)
  add    %eax,%esi
  movzbl 0xe(%rdi),%eax
  mulb   0xb(%rcx)
  add    %eax,%esi
  mov    %sil,0xf(%rdx)
  ret
```

assistant: ```c
void matrix_multiply(unsigned char matrix1[4][4], unsigned char matrix2[4][4], unsigned char target[4][4]) {
  int i;
  int j;
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
      target[i][j] = matrix1[i][0] * matrix2[0][j] + matrix1[i][1] * matrix2[1][j] + matrix1[i][2] * matrix2[2][j] + matrix1[i][3] * matrix2[3][j];
    }
  }
}
```