user: 请将以下的汇编代码转换成C语言代码：

```asm
<insert_string>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %edx,-0x84(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x84(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L9
  mov    -0x84(%rbp),%eax
  mov    %eax,-0x6c(%rbp)
  movl   $0x0,-0x68(%rbp)
  jmp    L102
L69:
  mov    -0x68(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  mov    -0x6c(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x78(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x6c(%rbp)
  addl   $0x1,-0x68(%rbp)
L102:
  mov    -0x68(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L69
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  jmp    L114
L9:
  movl   $0x0,-0x6c(%rbp)
  movl   $0x0,-0x68(%rbp)
  jmp    L53
L79:
  mov    -0x68(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jne    L65
  movl   $0x0,-0x64(%rbp)
  jmp    L68
L111:
  mov    -0x64(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  mov    -0x68(%rbp),%ecx
  mov    -0x64(%rbp),%edx
  add    %edx,%ecx
  movzbl (%rax),%edx
  movslq %ecx,%rax
  mov    %dl,-0x60(%rbp,%rax,1)
  addl   $0x1,-0x64(%rbp)
L68:
  mov    -0x64(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L111
  mov    -0x64(%rbp),%eax
  add    %eax,-0x68(%rbp)
L65:
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x68(%rbp),%eax
  cltq
  mov    %dl,-0x60(%rbp,%rax,1)
  addl   $0x1,-0x6c(%rbp)
  addl   $0x1,-0x68(%rbp)
L53:
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L79
  mov    -0x68(%rbp),%eax
  cltq
  movb   $0x0,-0x60(%rbp,%rax,1)
  movl   $0x0,-0x6c(%rbp)
  jmp    L2
L93:
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rax,%rdx
  mov    -0x6c(%rbp),%eax
  cltq
  movzbl -0x60(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x6c(%rbp)
L2:
  mov    -0x6c(%rbp),%eax
  cltq
  movzbl -0x60(%rbp,%rax,1),%eax
  test   %al,%al
  jne    L93
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
L114:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L29
  call   <__stack_chk_fail@plt>
L29:
  leave
  ret
```

assistant: ```c
void insert_string(char source[], char inject[], int index) {
  int i, j, k;
  char temp_string[81];
  if (source[index] == '\0') {
    for (i = index, j = 0; inject[j] != '\0'; ++i, ++j) {
      source[i] = inject[j];
    }
    source[i] = '\0';
  } else {
    for (i = 0, j = 0; source[i] != '\0'; ++i, ++j) {
      if (j == index) {
        for (k = 0; inject[k] != '\0'; ++k) {
          temp_string[j + k] = inject[k];
        }
        j += k;
      }
      temp_string[j] = source[i];
    }
    temp_string[j] = '\0';
    for (i = 0; temp_string[i] != '\0'; ++i) {
      source[i] = temp_string[i];
    }
    source[i] = '\0';
  }
}
```