user: 请从给定的汇编指令推导出C源代码:

```asm
<edit_distn>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x270,%rsp
  mov    %rdi,-0x258(%rbp)
  mov    %rsi,-0x260(%rbp)
  mov    %rdx,-0x268(%rbp)
  mov    %rcx,-0x270(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x210(%rbp),%rax
  mov    %rax,-0x238(%rbp)
  lea    -0x210(%rbp),%rax
  add    $0x104,%rax
  mov    %rax,-0x230(%rbp)
  movq   $0x0,-0x220(%rbp)
  jmp    L44
L76:
  mov    -0x220(%rbp),%rax
  mov    %eax,%edx
  mov    -0x220(%rbp),%rax
  mov    %edx,-0x210(%rbp,%rax,4)
  addq   $0x1,-0x220(%rbp)
L44:
  mov    -0x220(%rbp),%rax
  cmp    -0x270(%rbp),%rax
  jbe    L76
  movq   $0x0,-0x228(%rbp)
  jmp    L24
L43:
  mov    -0x228(%rbp),%rax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x230(%rbp),%rax
  mov    %edx,(%rax)
  movq   $0x0,-0x220(%rbp)
  jmp    L61
L40:
  mov    -0x220(%rbp),%rax
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x238(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  add    $0x1,%eax
  mov    %eax,-0x244(%rbp)
  mov    -0x220(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x230(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  add    $0x1,%eax
  mov    %eax,-0x240(%rbp)
  mov    -0x220(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x238(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ecx
  mov    -0x258(%rbp),%rdx
  mov    -0x228(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x268(%rbp),%rsi
  mov    -0x220(%rbp),%rax
  add    %rsi,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L78
  mov    $0x0,%eax
  jmp    L3
L78:
  mov    $0x2,%eax
L3:
  add    %ecx,%eax
  mov    %eax,-0x23c(%rbp)
  mov    -0x240(%rbp),%edx
  mov    -0x244(%rbp),%eax
  cmp    %eax,%edx
  cmovg  %eax,%edx
  mov    -0x220(%rbp),%rax
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rcx
  mov    -0x230(%rbp),%rax
  add    %rax,%rcx
  mov    -0x23c(%rbp),%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  mov    %eax,(%rcx)
  addq   $0x1,-0x220(%rbp)
L61:
  mov    -0x220(%rbp),%rax
  cmp    -0x270(%rbp),%rax
  jb     L40
  mov    -0x238(%rbp),%rax
  mov    %rax,-0x218(%rbp)
  mov    -0x230(%rbp),%rax
  mov    %rax,-0x238(%rbp)
  mov    -0x218(%rbp),%rax
  mov    %rax,-0x230(%rbp)
  addq   $0x1,-0x228(%rbp)
L24:
  mov    -0x228(%rbp),%rax
  cmp    -0x260(%rbp),%rax
  jb     L43
  mov    -0x270(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x238(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L26
  call   <__stack_chk_fail@plt>
L26:
  leave
  ret
```

assistant: ```c
int edit_distn(const char *s1, size_t s1len, const char *s2, size_t s2len) {
  int t[2][64 + 1];
  int *t1 = t[0];
  int *t2 = t[1];
  int *t3;
  size_t i1, i2;
  for (i2 = 0; i2 <= s2len; i2++)
    t[0][i2] = i2 * 1;
  for (i1 = 0; i1 < s1len; i1++) {
    t2[0] = (i1 + 1) * 1;
    for (i2 = 0; i2 < s2len; i2++) {
      int cost_a = t1[i2 + 1] + 1;
      int cost_d = t2[i2] + 1;
      int cost_r = t1[i2] + (s1[i1] == s2[i2] ? 0 : 2);
      t2[i2 + 1] = ((((cost_a) < (cost_d) ? (cost_a) : (cost_d))) < (cost_r) ? (((cost_a) < (cost_d) ? (cost_a) : (cost_d))) : (cost_r));
    }
    t3 = t1;
    t1 = t2;
    t2 = t3;
  }
  return t1[s2len];
}
```