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

```asm
<matrix_chain_order>:
  endbr64
  push   %r15
  lea    0x20(%rsi),%rax
  push   %r14
  push   %r13
  mov    $0x2,%r13d
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    $0x8,%ebp
  push   %rbx
  mov    $0x5,%ebx
  movl   $0x0,0x20(%rsi)
  movl   $0x0,0x40(%rsi)
  mov    %rdx,-0x18(%rsp)
  movl   $0x0,0x60(%rsi)
  movl   $0x0,0x80(%rsi)
  movl   $0x0,0xa0(%rsi)
  movl   $0x0,0xc0(%rsi)
  mov    %rax,-0x10(%rsp)
  mov    %rsi,-0x8(%rsp)
L151:
  mov    -0x18(%rsp),%rcx
  mov    -0x8(%rsp),%rax
  mov    %r13d,%esi
  mov    %r12,%rdx
  mov    -0x10(%rsp),%r8
  lea    (%r12,%rbp,1),%rdi
  lea    (%rcx,%rbp,1),%r10
  add    %rbp,%rax
  mov    $0x1,%ecx
  nopl   0x0(%rax)
L92:
  movl   $0xffff,0x1c(%rax)
  lea    0x1(%rcx),%r11d
  cmp    %esi,%ecx
  jge    L1
  mov    0x4(%rdx),%r9d
  imul   (%rdx),%r9d
  imul   (%rdi),%r9d
  mov    (%r8),%r11d
  add    0x38(%rax),%r11d
  add    %r11d,%r9d
  cmp    $0xfffe,%r9d
  jg     L101
  mov    %r9d,0x1c(%rax)
  mov    %ecx,0x1c(%r10)
L101:
  lea    0x1(%rcx),%r11d
  cmp    %r11d,%esi
  jle    L1
  mov    0x8(%rdx),%r9d
  imul   (%rdx),%r9d
  imul   (%rdi),%r9d
  mov    0x4(%r8),%r14d
  add    0x54(%rax),%r14d
  add    %r14d,%r9d
  cmp    0x1c(%rax),%r9d
  jge    L85
  mov    %r9d,0x1c(%rax)
  mov    %r11d,0x1c(%r10)
L85:
  lea    0x2(%rcx),%r14d
  cmp    %r14d,%esi
  jle    L1
  mov    (%rdx),%r9d
  imul   0xc(%rdx),%r9d
  imul   (%rdi),%r9d
  mov    0x70(%rax),%r15d
  add    0x8(%r8),%r15d
  add    %r15d,%r9d
  cmp    %r9d,0x1c(%rax)
  jle    L88
  mov    %r9d,0x1c(%rax)
  mov    %r14d,0x1c(%r10)
L88:
  lea    0x3(%rcx),%r14d
  cmp    %r14d,%esi
  jle    L1
  mov    (%rdx),%r9d
  imul   0x10(%rdx),%r9d
  imul   (%rdi),%r9d
  mov    0x8c(%rax),%r15d
  add    0xc(%r8),%r15d
  add    %r15d,%r9d
  cmp    %r9d,0x1c(%rax)
  jle    L99
  mov    %r9d,0x1c(%rax)
  mov    %r14d,0x1c(%r10)
L99:
  lea    0x4(%rcx),%r14d
  cmp    %r14d,%esi
  jle    L1
  mov    (%rdx),%r9d
  imul   0x14(%rdx),%r9d
  imul   (%rdi),%r9d
  mov    0xa8(%rax),%r15d
  add    0x10(%r8),%r15d
  add    %r15d,%r9d
  cmp    %r9d,0x1c(%rax)
  jle    L199
  mov    %r9d,0x1c(%rax)
  mov    %r14d,0x1c(%r10)
L199:
  lea    0x5(%rcx),%r14d
  cmp    %r14d,%esi
  jle    L1
  mov    (%rdx),%r9d
  imul   0x18(%rdx),%r9d
  imul   (%rdi),%r9d
  mov    0xc4(%rax),%r15d
  add    0x14(%r8),%r15d
  add    %r15d,%r9d
  cmp    %r9d,0x1c(%rax)
  jle    L77
  mov    %r9d,0x1c(%rax)
  mov    %r14d,0x1c(%r10)
L77:
  lea    0x6(%rcx),%r14d
  cmp    %r14d,%esi
  jle    L1
  mov    (%rdx),%r9d
  imul   0x1c(%rdx),%r9d
  imul   (%rdi),%r9d
  mov    0xe0(%rax),%r15d
  add    0x18(%r8),%r15d
  add    %r15d,%r9d
  cmp    %r9d,0x1c(%rax)
  jle    L74
  mov    %r9d,0x1c(%rax)
  mov    %r14d,0x1c(%r10)
L74:
  lea    0x7(%rcx),%r14d
  cmp    %r14d,%esi
  jle    L1
  mov    (%rdx),%r9d
  imul   0x20(%rdx),%r9d
  imul   (%rdi),%r9d
  mov    0xfc(%rax),%r15d
  add    0x1c(%r8),%r15d
  add    %r15d,%r9d
  cmp    %r9d,0x1c(%rax)
  jle    L159
  mov    %r9d,0x1c(%rax)
  mov    %r14d,0x1c(%r10)
L159:
  add    $0x8,%ecx
  cmp    %ecx,%esi
  jle    L1
  mov    (%rdx),%r9d
  imul   0x24(%rdx),%r9d
  imul   (%rdi),%r9d
  mov    0x118(%rax),%r14d
  add    0x20(%r8),%r14d
  add    %r14d,%r9d
  cmp    0x1c(%rax),%r9d
  jge    L1
  mov    %r9d,0x1c(%rax)
  mov    %ecx,0x1c(%r10)
  nopw   0x0(%rax,%rax,1)
L1:
  mov    %r11d,%ecx
  add    $0x20,%rax
  add    $0x1,%esi
  add    $0x20,%r8
  add    $0x4,%rdx
  add    $0x4,%rdi
  add    $0x20,%r10
  cmp    %ebx,%r11d
  jle    L92
  add    $0x1,%r13d
  add    $0x4,%rbp
  sub    $0x1,%ebx
  jne    L151
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void matrix_chain_order(int *p, int m[7][7], int s[7][7]) {
  int i, j, k, l, n, q;
  n = sizeof(p) / sizeof(char) - 2;
  for (i = 1; i <= n; i++)
    m[i][i] = 0;
  for (l = 2; l <= n; l++) {
    for (i = 1; i <= n - l + 1; i++) {
      j = i + l - 1;
      m[i][j] = 65535;
      for (k = i; k <= j - 1; k++) {
        q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
        if (q < m[i][j]) {
          m[i][j] = q;
          s[i][j] = k;
        }
      }
    }
  }
}
```