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

```asm
<addBinary>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  call   <reverse@plt>
  mov    %rbp,%rdi
  mov    %eax,%r15d
  mov    %eax,0xc(%rsp)
  call   <reverse@plt>
  movb   $0x30,0x27(%rsp)
  mov    %eax,%ebx
  mov    %eax,0x10(%rsp)
  lea    0x2(%r15),%eax
  cmp    %ebx,%r15d
  lea    0x2(%rbx),%edi
  cmovg  %eax,%edi
  call   <malloc@plt>
  cmp    %ebx,%r15d
  cmovle %r15d,%ebx
  mov    %rax,%r13
  mov    %ebx,0x14(%rsp)
  test   %ebx,%ebx
  jle    L46
  movslq %ebx,%rax
  mov    %r13,%r15
  lea    0x27(%rsp),%rbx
  mov    %r13,%r14
  mov    %rax,0x18(%rsp)
  add    %r13,%rax
  neg    %r15
  mov    %rax,(%rsp)
  nopl   0x0(%rax)
L13:
  lea    0x0(%rbp,%r15,1),%rax
  mov    %rbx,%rdx
  movsbl (%rax,%r14,1),%esi
  lea    (%r12,%r15,1),%rax
  movsbl (%rax,%r14,1),%edi
  add    $0x1,%r14
  call   <addChar@plt>
  mov    %al,-0x1(%r14)
  cmp    (%rsp),%r14
  jne    L13
  mov    0x18(%rsp),%rax
  mov    0xc(%rsp),%ebx
  mov    0x14(%rsp),%ecx
  add    %r13,%rax
  cmp    %ecx,%ebx
  jle    L119
L67:
  movslq %ecx,%rax
  sub    %r13,%r12
  lea    0x1(%r13,%rax,1),%rdx
  lea    0x0(%r13,%rax,1),%r15
  lea    -0x1(%rbx),%eax
  lea    0x27(%rsp),%rbx
  sub    %ecx,%eax
  lea    (%rdx,%rax,1),%r14
  nop
L55:
  movsbl (%r12,%r15,1),%edi
  mov    %rbx,%rdx
  mov    $0x30,%esi
  add    $0x1,%r15
  call   <addChar@plt>
  mov    %al,-0x1(%r15)
  cmp    %r14,%r15
  jne    L55
  movslq 0xc(%rsp),%rax
  add    %r13,%rax
L24:
  mov    0x10(%rsp),%esi
  mov    0xc(%rsp),%ecx
  cmp    %ecx,%esi
  jle    L65
  movslq %ecx,%rax
  lea    0x27(%rsp),%rbx
  sub    %r13,%rbp
  lea    0x1(%r13,%rax,1),%rdx
  lea    0x0(%r13,%rax,1),%r12
  lea    -0x1(%rsi),%eax
  sub    %ecx,%eax
  lea    (%rdx,%rax,1),%r14
  nopl   (%rax)
L95:
  movsbl 0x0(%rbp,%r12,1),%esi
  mov    %rbx,%rdx
  mov    $0x30,%edi
  add    $0x1,%r12
  call   <addChar@plt>
  mov    %al,-0x1(%r12)
  cmp    %r12,%r14
  jne    L95
  movslq 0x10(%rsp),%rax
  add    %r13,%rax
L71:
  cmpb   $0x31,0x27(%rsp)
  je     L94
  movb   $0x0,(%rax)
L44:
  mov    %r13,%rdi
  call   <reverse@plt>
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L0
  add    $0x38,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L94:
  movb   $0x31,(%rax)
  mov    0x10(%rsp),%eax
  add    $0x1,%eax
  cltq
  movb   $0x0,0x0(%r13,%rax,1)
  jmp    L44
  nopl   0x0(%rax)
L65:
  mov    %ecx,0x10(%rsp)
  jmp    L71
  cs nopw 0x0(%rax,%rax,1)
L46:
  movl   $0x0,0x14(%rsp)
  mov    0xc(%rsp),%ebx
  mov    0x14(%rsp),%ecx
  cmp    %ecx,%ebx
  jg     L67
  nopl   0x0(%rax,%rax,1)
L119:
  mov    %ecx,0xc(%rsp)
  jmp    L24
L0:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
char *addBinary(char *a, char *b) {
  char *c;
  int aSize = reverse(a);
  int bSize = reverse(b);
  int cSize;
  int i = 0, j = 0;
  char tag = '0';
  cSize = aSize > bSize ? aSize + 2 : bSize + 2;
  c = (char *)malloc(sizeof(char) * cSize);
  while ((i < aSize) && (i < bSize)) {
    c[i] = addChar(a[i], b[i], &tag);
    i++;
  }
  while (i < aSize) {
    c[i] = addChar(a[i], '0', &tag);
    i++;
  }
  while (i < bSize) {
    c[i] = addChar('0', b[i], &tag);
    i++;
  }
  if (tag == '1') {
    c[i++] = tag;
    c[i] = '\0';
  } else {
    c[i] = '\0';
  }
  reverse(c);
  return c;
}
```