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

```asm
<similarity>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r12
  push   %rbx
  lea    -0x27000(%rsp),%r11
L94:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L94
  sub    $0x140,%rsp
  mov    %rdi,-0x27138(%rbp)
  mov    %esi,-0x2713c(%rbp)
  mov    %rdx,-0x27148(%rbp)
  mov    %ecx,-0x27140(%rbp)
  mov    %r8,-0x27150(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  lea    -0x27120(%rbp),%rax
  mov    $0x27100,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  movl   $0x0,-0x27130(%rbp)
  jmp    L31
L10:
  mov    -0x27130(%rbp),%eax
  cltq
  mov    -0x27120(%rbp,%rax,4),%ecx
  mov    -0x27150(%rbp),%rax
  lea    0xb400(%rax),%rdx
  mov    -0x27130(%rbp),%eax
  movslq %eax,%rsi
  mov    -0x27148(%rbp),%rax
  add    %rsi,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cltq
  mov    (%rdx,%rax,4),%edx
  mov    -0x27130(%rbp),%eax
  add    $0x1,%eax
  add    %ecx,%edx
  cltq
  mov    %edx,-0x27120(%rbp,%rax,4)
  addl   $0x1,-0x27130(%rbp)
L31:
  mov    -0x27130(%rbp),%eax
  cmp    -0x27140(%rbp),%eax
  jl     L10
  movl   $0x0,-0x2712c(%rbp)
  jmp    L96
L45:
  mov    -0x2712c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x5,%rax
  lea    -0x10(%rax),%rax
  add    %rbp,%rax
  sub    $0x27110,%rax
  mov    (%rax),%ecx
  mov    -0x2712c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x27138(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbq %al,%rax
  shl    $0xa,%rax
  mov    %rax,%rdx
  mov    -0x27150(%rbp),%rax
  add    %rdx,%rax
  mov    0xb4(%rax),%edx
  mov    -0x2712c(%rbp),%eax
  add    $0x1,%eax
  add    %edx,%ecx
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x5,%rax
  lea    -0x10(%rax),%rax
  add    %rbp,%rax
  sub    $0x27110,%rax
  mov    %ecx,(%rax)
  addl   $0x1,-0x2712c(%rbp)
L96:
  mov    -0x2712c(%rbp),%eax
  cmp    -0x2713c(%rbp),%eax
  jl     L45
  movl   $0x0,-0x27128(%rbp)
  jmp    L42
L37:
  movl   $0x0,-0x27124(%rbp)
  jmp    L61
L7:
  mov    -0x27124(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x27128(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rcx,%rax
  mov    -0x27120(%rbp,%rax,4),%ecx
  mov    -0x27128(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x27138(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbq %al,%rax
  shl    $0xa,%rax
  mov    %rax,%rdx
  mov    -0x27150(%rbp),%rax
  add    %rax,%rdx
  mov    -0x27124(%rbp),%eax
  movslq %eax,%rsi
  mov    -0x27148(%rbp),%rax
  add    %rsi,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x27128(%rbp),%eax
  lea    0x1(%rax),%ecx
  mov    -0x27124(%rbp),%eax
  movslq %eax,%rsi
  movslq %ecx,%rcx
  mov    %rcx,%rax
  shl    $0x2,%rax
  add    %rcx,%rax
  lea    0x0(,%rax,4),%rcx
  add    %rcx,%rax
  shl    $0x3,%rax
  add    %rsi,%rax
  mov    -0x27120(%rbp,%rax,4),%esi
  mov    -0x27150(%rbp),%rax
  lea    0xb400(%rax),%rcx
  mov    -0x27124(%rbp),%eax
  movslq %eax,%rdi
  mov    -0x27148(%rbp),%rax
  add    %rdi,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cltq
  mov    (%rcx,%rax,4),%eax
  add    %esi,%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <max@plt>
  mov    %eax,%ecx
  mov    -0x27124(%rbp),%eax
  add    $0x1,%eax
  movslq %eax,%rsi
  mov    -0x27128(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rsi,%rax
  mov    -0x27120(%rbp,%rax,4),%edx
  mov    -0x27128(%rbp),%eax
  movslq %eax,%rsi
  mov    -0x27138(%rbp),%rax
  add    %rsi,%rax
  movzbl (%rax),%eax
  movsbq %al,%rax
  shl    $0xa,%rax
  mov    %rax,%rsi
  mov    -0x27150(%rbp),%rax
  add    %rsi,%rax
  mov    0xb4(%rax),%eax
  add    %edx,%eax
  mov    -0x27128(%rbp),%edx
  lea    0x1(%rdx),%ebx
  mov    -0x27124(%rbp),%edx
  lea    0x1(%rdx),%r12d
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <max@plt>
  mov    %eax,%edx
  movslq %r12d,%rsi
  movslq %ebx,%rcx
  mov    %rcx,%rax
  shl    $0x2,%rax
  add    %rcx,%rax
  lea    0x0(,%rax,4),%rcx
  add    %rcx,%rax
  shl    $0x3,%rax
  add    %rsi,%rax
  mov    %edx,-0x27120(%rbp,%rax,4)
  addl   $0x1,-0x27124(%rbp)
L61:
  mov    -0x27124(%rbp),%eax
  cmp    -0x27140(%rbp),%eax
  jl     L7
  addl   $0x1,-0x27128(%rbp)
L42:
  mov    -0x27128(%rbp),%eax
  cmp    -0x2713c(%rbp),%eax
  jl     L37
  mov    -0x27140(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x2713c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rcx,%rax
  mov    -0x27120(%rbp,%rax,4),%eax
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L60
  call   <__stack_chk_fail@plt>
L60:
  add    $0x27140,%rsp
  pop    %rbx
  pop    %r12
  pop    %rbp
  ret
```

assistant: ```c
int similarity(char *a, int a_len, char *b, int b_len, int score[][256]) {
  int s[200][200] = {0};
  for (int j = 0; j < b_len; ++j) {
    s[0][j + 1] = s[0][j] + score['-'][b[j]];
  }
  for (int i = 0; i < a_len; ++i) {
    s[i + 1][0] = s[i][0] + score[a[i]]['-'];
  }
  for (int i = 0; i < a_len; ++i) {
    for (int j = 0; j < b_len; ++j) {
      s[i + 1][j + 1] = max(s[i][j + 1] + score[a[i]]['-'], max(s[i + 1][j] + score['-'][b[j]], s[i][j] + score[a[i]][b[j]]));
    }
  }
  return s[a_len][b_len];
}
```