user: 下面的汇编指令对应的C源代码是什么:

```asm
<add_double_circle>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x178,%rsp
  mov    %rdi,-0x178(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x160(%rbp)
  movq   $0x0,-0x158(%rbp)
  mov    $0x0,%eax
  mov    $0x40200,%edx
  mov    %rax,-0x150(%rbp)
  mov    %rdx,-0x148(%rbp)
  mov    $0x20400,%eax
  mov    $0x40200,%edx
  mov    %rax,-0x140(%rbp)
  mov    %rdx,-0x138(%rbp)
  movq   $0x0,-0x130(%rbp)
  movq   $0x0,-0x128(%rbp)
  movl   $0x0,-0x16c(%rbp)
  jmp    L66
L47:
  mov    -0x16c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x178(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    -0x16c(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x178(%rbp),%rdx
  lea    (%rcx,%rdx,1),%rbx
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %al,(%rbx)
  mov    -0x16c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x178(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jg     L33
  mov    -0x16c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x178(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  jmp    L4
L33:
  mov    -0x16c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x178(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x37,%eax
L4:
  mov    %eax,-0x168(%rbp)
  mov    -0x16c(%rbp),%eax
  cltq
  movzbl -0x160(%rbp,%rax,1),%eax
  movsbl %al,%eax
  or     -0x168(%rbp),%eax
  mov    %eax,-0x164(%rbp)
  cmpl   $0x9,-0x164(%rbp)
  jg     L57
  mov    -0x164(%rbp),%eax
  add    $0x30,%eax
  mov    %eax,%edx
  jmp    L42
L57:
  mov    -0x164(%rbp),%eax
  add    $0x37,%eax
  mov    %eax,%edx
L42:
  mov    -0x16c(%rbp),%eax
  cltq
  mov    %dl,-0x120(%rbp,%rax,1)
  addl   $0x1,-0x16c(%rbp)
L66:
  cmpl   $0x3f,-0x16c(%rbp)
  jle    L47
  mov    -0x16c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x16c(%rbp)
  cltq
  movb   $0xa,-0x120(%rbp,%rax,1)
  mov    -0x16c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x16c(%rbp)
  cltq
  movb   $0x0,-0x120(%rbp,%rax,1)
  mov    -0x16c(%rbp),%edx
  lea    -0x120(%rbp),%rcx
  mov    -0x178(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  nop
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L58
  call   <__stack_chk_fail@plt>
L58:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void add_double_circle(char *glyphstring) {
  char newstring[256];
  char circle[64] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
  int digit1, digit2;
  int i;
  for (i = 0; i < 64; i++) {
    glyphstring[i] = toupper(glyphstring[i]);
    digit1 = (glyphstring[i] <= '9') ? (glyphstring[i] - '0') : (glyphstring[i] - 'A' + 0xA);
    digit2 = digit1 | circle[i];
    newstring[i] = (digit2 <= 9) ? ('0' + digit2) : ('A' + digit2 - 0xA);
  }
  newstring[i++] = '\n';
  newstring[i++] = '\0';
  strncpy(glyphstring, newstring, i);
  return;
}
```