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

```asm
<add_point>:
  endbr64
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %rdx,%rbx
  call   <string_length@plt>
  mov    %eax,%edx
  sub    %r12d,%edx
  js     L117
  je     L203
  lea    0x1(%rbp),%rsi
  mov    %rbx,%rcx
  lea    -0x1(%rdx),%eax
  sub    %rsi,%rcx
  cmp    $0xe,%rcx
  jbe    L73
  cmp    $0x6,%eax
  jbe    L73
  cmp    $0xe,%eax
  jbe    L170
  mov    %edx,%ecx
  xor    %eax,%eax
  shr    $0x4,%ecx
  shl    $0x4,%rcx
  nopl   0x0(%rax,%rax,1)
L106:
  movdqu 0x0(%rbp,%rax,1),%xmm0
  movups %xmm0,(%rbx,%rax,1)
  add    $0x10,%rax
  cmp    %rax,%rcx
  jne    L106
  mov    %edx,%eax
  mov    %edx,%ecx
  and    $0xfffffff0,%eax
  mov    %eax,%esi
  lea    0x0(%rbp,%rsi,1),%r9
  lea    (%rbx,%rsi,1),%r8
  cmp    %eax,%edx
  je     L159
  mov    %edx,%edi
  sub    %eax,%edi
  lea    -0x1(%rdi),%ecx
  cmp    $0x6,%ecx
  jbe    L3
L88:
  mov    0x0(%rbp,%rsi,1),%rcx
  mov    %rcx,(%rbx,%rsi,1)
  mov    %edi,%esi
  and    $0xfffffff8,%esi
  mov    %esi,%ecx
  add    %esi,%eax
  add    %rcx,%r9
  add    %rcx,%r8
  mov    %edx,%ecx
  cmp    %esi,%edi
  je     L159
L3:
  movzbl (%r9),%ecx
  lea    0x1(%rax),%esi
  mov    %cl,(%r8)
  mov    %edx,%ecx
  cmp    %esi,%edx
  jle    L159
  movzbl 0x1(%r9),%esi
  mov    %sil,0x1(%r8)
  lea    0x2(%rax),%esi
  cmp    %esi,%edx
  jle    L159
  movzbl 0x2(%r9),%esi
  mov    %sil,0x2(%r8)
  lea    0x3(%rax),%esi
  cmp    %esi,%edx
  jle    L159
  movzbl 0x3(%r9),%esi
  mov    %sil,0x3(%r8)
  lea    0x4(%rax),%esi
  cmp    %esi,%edx
  jle    L159
  movzbl 0x4(%r9),%esi
  mov    %sil,0x4(%r8)
  lea    0x5(%rax),%esi
  cmp    %esi,%edx
  jle    L159
  movzbl 0x5(%r9),%esi
  add    $0x6,%eax
  mov    %sil,0x5(%r8)
  cmp    %eax,%edx
  jle    L159
  movzbl 0x6(%r9),%eax
  mov    %al,0x6(%r8)
L159:
  add    %rcx,%rbp
  add    %rcx,%rbx
L203:
  movb   $0x2e,(%rbx)
  movzbl 0x0(%rbp),%edx
  test   %dl,%dl
  je     L33
  mov    $0x1,%eax
  cs nopw 0x0(%rax,%rax,1)
L181:
  mov    %dl,(%rbx,%rax,1)
  add    $0x1,%rax
  movzbl -0x1(%rbp,%rax,1),%edx
  test   %dl,%dl
  jne    L181
L33:
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L117:
  sub    %eax,%r12d
  mov    $0x2e30,%eax
  add    $0x2,%rbx
  mov    %ax,-0x2(%rbx)
  test   %r12d,%r12d
  jle    L122
  movslq %r12d,%r12
  mov    %rbx,%rdi
  mov    $0x30,%esi
  mov    %r12,%rdx
  add    %r12,%rbx
  call   <memset@plt>
L122:
  movzbl 0x0(%rbp),%edx
  test   %dl,%dl
  je     L33
  xor    %eax,%eax
  nopl   (%rax)
L191:
  mov    %dl,(%rbx,%rax,1)
  add    $0x1,%rax
  movzbl 0x0(%rbp,%rax,1),%edx
  test   %dl,%dl
  jne    L191
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L73:
  mov    %edx,%ecx
  xor    %eax,%eax
  nopl   0x0(%rax)
L154:
  movzbl 0x0(%rbp,%rax,1),%edx
  mov    %dl,(%rbx,%rax,1)
  add    $0x1,%rax
  cmp    %rcx,%rax
  jne    L154
  add    %rcx,%rbp
  add    %rcx,%rbx
  jmp    L203
L170:
  mov    %edx,%edi
  mov    %rbx,%r8
  mov    %rbp,%r9
  xor    %eax,%eax
  xor    %esi,%esi
  jmp    L88
```

assistant: ```c
void add_point(char *str, int point, char *target) {
  int i;
  point = string_length(str) - point;
  if (point < 0) {
    point = -point;
    *target = '0';
    target++;
    *target = '.';
    target++;
    for (i = 0; i < point; i++) {
      *target = '0';
      target++;
    }
    for (; *str != '\0'; str++) {
      *target = *str;
      target++;
    }
  } else {
    for (i = 0; i < point; i++) {
      *target = *str;
      target++;
      str++;
    }
    *target = '.';
    target++;
    for (; *str != '\0'; str++) {
      *target = *str;
      target++;
    }
  }
}
```