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

```asm
<micro_qr_m2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %esi,-0x4c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x30(%rbp)
  cmpl   $0x1,-0x4c(%rbp)
  jne    L65
  movl   $0x28,-0x2c(%rbp)
L65:
  cmpl   $0x2,-0x4c(%rbp)
  jne    L197
  movl   $0x20,-0x2c(%rbp)
L197:
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  cmpl   $0x5,-0x1c(%rbp)
  jg     L273
  movl   $0x0,-0x34(%rbp)
  jmp    L146
L92:
  mov    -0x48(%rbp),%rax
  lea    D46(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <concat@plt>
  addl   $0x1,-0x34(%rbp)
L146:
  mov    -0x34(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jl     L92
  movl   $0x1,-0x30(%rbp)
  jmp    L275
L273:
  mov    -0x48(%rbp),%rax
  lea    D15(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <concat@plt>
L275:
  cmpl   $0x0,-0x30(%rbp)
  jne    L136
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cltd
  shr    $0x1d,%edx
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  mov    %eax,%edx
  mov    $0x8,%eax
  sub    %edx,%eax
  mov    %eax,-0x28(%rbp)
  cmpl   $0x8,-0x28(%rbp)
  jne    L186
  movl   $0x0,-0x28(%rbp)
L186:
  movl   $0x0,-0x34(%rbp)
  jmp    L118
L219:
  mov    -0x48(%rbp),%rax
  lea    D46(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <concat@plt>
  addl   $0x1,-0x34(%rbp)
L118:
  mov    -0x34(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jl     L219
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  lea    0x7(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0x3,%eax
  mov    %eax,-0x28(%rbp)
  movl   $0x0,-0x34(%rbp)
  jmp    L95
L113:
  mov    -0x34(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L220
  lea    D47(%rip),%rax
  jmp    L183
L220:
  lea    D30(%rip),%rax
L183:
  mov    -0x48(%rbp),%rdx
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <concat@plt>
  addl   $0x1,-0x34(%rbp)
L95:
  mov    -0x34(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jl     L113
L136:
  cmpl   $0x1,-0x4c(%rbp)
  jne    L8
  movl   $0x5,-0x24(%rbp)
  movl   $0x5,-0x20(%rbp)
L8:
  cmpl   $0x2,-0x4c(%rbp)
  jne    L82
  movl   $0x4,-0x24(%rbp)
  movl   $0x6,-0x20(%rbp)
L82:
  movl   $0x0,-0x34(%rbp)
  jmp    L148
L259:
  mov    -0x34(%rbp),%eax
  cltq
  movb   $0x0,-0x15(%rbp,%rax,1)
  mov    -0x34(%rbp),%eax
  shl    $0x3,%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L48
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x15(%rbp,%rax,1),%eax
  lea    -0x80(%rax),%edx
  mov    -0x34(%rbp),%eax
  cltq
  mov    %dl,-0x15(%rbp,%rax,1)
L48:
  mov    -0x34(%rbp),%eax
  shl    $0x3,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L2
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x15(%rbp,%rax,1),%eax
  lea    0x40(%rax),%edx
  mov    -0x34(%rbp),%eax
  cltq
  mov    %dl,-0x15(%rbp,%rax,1)
L2:
  mov    -0x34(%rbp),%eax
  shl    $0x3,%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L288
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x15(%rbp,%rax,1),%eax
  lea    0x20(%rax),%edx
  mov    -0x34(%rbp),%eax
  cltq
  mov    %dl,-0x15(%rbp,%rax,1)
L288:
  mov    -0x34(%rbp),%eax
  shl    $0x3,%eax
  cltq
  lea    0x3(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L230
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x15(%rbp,%rax,1),%eax
  lea    0x10(%rax),%edx
  mov    -0x34(%rbp),%eax
  cltq
  mov    %dl,-0x15(%rbp,%rax,1)
L230:
  mov    -0x34(%rbp),%eax
  shl    $0x3,%eax
  cltq
  lea    0x4(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L41
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x15(%rbp,%rax,1),%eax
  lea    0x8(%rax),%edx
  mov    -0x34(%rbp),%eax
  cltq
  mov    %dl,-0x15(%rbp,%rax,1)
L41:
  mov    -0x34(%rbp),%eax
  shl    $0x3,%eax
  cltq
  lea    0x5(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L278
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x15(%rbp,%rax,1),%eax
  lea    0x4(%rax),%edx
  mov    -0x34(%rbp),%eax
  cltq
  mov    %dl,-0x15(%rbp,%rax,1)
L278:
  mov    -0x34(%rbp),%eax
  shl    $0x3,%eax
  cltq
  lea    0x6(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L210
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x15(%rbp,%rax,1),%eax
  lea    0x2(%rax),%edx
  mov    -0x34(%rbp),%eax
  cltq
  mov    %dl,-0x15(%rbp,%rax,1)
L210:
  mov    -0x34(%rbp),%eax
  shl    $0x3,%eax
  cltq
  lea    0x7(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L266
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x15(%rbp,%rax,1),%eax
  lea    0x1(%rax),%edx
  mov    -0x34(%rbp),%eax
  cltq
  mov    %dl,-0x15(%rbp,%rax,1)
L266:
  addl   $0x1,-0x34(%rbp)
L148:
  mov    -0x34(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L259
  mov    $0x11d,%edi
  call   <rs_init_gf@plt>
  mov    -0x20(%rbp),%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <rs_init_code@plt>
  lea    -0xf(%rbp),%rdx
  lea    -0x15(%rbp),%rcx
  mov    -0x24(%rbp),%eax
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <rs_encode@plt>
  mov    $0x0,%eax
  call   <rs_free@plt>
  movl   $0x0,-0x34(%rbp)
  jmp    L73
L158:
  mov    -0x20(%rbp),%eax
  sub    -0x34(%rbp),%eax
  sub    $0x1,%eax
  cltq
  movzbl -0xf(%rbp,%rax,1),%eax
  movzbl %al,%ecx
  mov    -0x48(%rbp),%rax
  mov    $0x80,%edx
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <qr_diran@plt>
  addl   $0x1,-0x34(%rbp)
L73:
  mov    -0x34(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jl     L158
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L155
  call   <__stack_chk_fail@plt>
L155:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D46
data_type: string
name: disassemble_data
arguments: data_tag: D15
data_type: string
name: disassemble_data
arguments: data_tag: D47
data_type: string
name: disassemble_data
arguments: data_tag: D30
data_type: string

tool: D46: 0

tool: D15: 00000

tool: D47: 00010001

tool: D30: 11101100

assistant: ```c
void micro_qr_m2(char binary_data[], int ecc_mode) {
  int i, latch;
  int bits_total, bits_left, remainder;
  int data_codewords, ecc_codewords;
  unsigned char data_blocks[6], ecc_blocks[7];
  latch = 0;
  if (ecc_mode == 1) {
    bits_total = 40;
  }
  if (ecc_mode == 2) {
    bits_total = 32;
  }
  bits_left = bits_total - strlen(binary_data);
  if (bits_left <= 5) {
    for (i = 0; i < bits_left; i++) {
      concat(binary_data, "0");
    }
    latch = 1;
  } else {
    concat(binary_data, "00000");
  }
  if (latch == 0) {
    remainder = 8 - (strlen(binary_data) % 8);
    if (remainder == 8) {
      remainder = 0;
    }
    for (i = 0; i < remainder; i++) {
      concat(binary_data, "0");
    }
    bits_left = bits_total - strlen(binary_data);
    remainder = bits_left / 8;
    for (i = 0; i < remainder; i++) {
      concat(binary_data, i & 1 ? "00010001" : "11101100");
    }
  }
  if (ecc_mode == 1) {
    data_codewords = 5;
    ecc_codewords = 5;
  }
  if (ecc_mode == 2) {
    data_codewords = 4;
    ecc_codewords = 6;
  }
  for (i = 0; i < data_codewords; i++) {
    data_blocks[i] = 0;
    if (binary_data[i * 8] == '1') {
      data_blocks[i] += 0x80;
    }
    if (binary_data[(i * 8) + 1] == '1') {
      data_blocks[i] += 0x40;
    }
    if (binary_data[(i * 8) + 2] == '1') {
      data_blocks[i] += 0x20;
    }
    if (binary_data[(i * 8) + 3] == '1') {
      data_blocks[i] += 0x10;
    }
    if (binary_data[(i * 8) + 4] == '1') {
      data_blocks[i] += 0x08;
    }
    if (binary_data[(i * 8) + 5] == '1') {
      data_blocks[i] += 0x04;
    }
    if (binary_data[(i * 8) + 6] == '1') {
      data_blocks[i] += 0x02;
    }
    if (binary_data[(i * 8) + 7] == '1') {
      data_blocks[i] += 0x01;
    }
  }
  rs_init_gf(0x11d);
  rs_init_code(ecc_codewords, 0);
  rs_encode(data_codewords, data_blocks, ecc_blocks);
  rs_free();
  for (i = 0; i < ecc_codewords; i++) {
    qr_diran(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80);
  }
  return;
}
```