user: 这段汇编代码用C语言表示是什么样的：

```asm
<micro_qr_m3>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%rbx
  mov    %esi,%ebp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  cmp    $0x2,%esi
  mov    $0x54,%r14d
  mov    $0x44,%eax
  cmove  %eax,%r14d
  call   <strlen@plt>
  mov    %r14d,%r13d
  sub    %eax,%r13d
  cmp    $0x7,%r13d
  jg     L288
  test   %r13d,%r13d
  jle    L86
  mov    $0x0,%r12d
  lea    D0(%rip),%r14
L188:
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <strcat@plt>
  add    $0x1,%r12d
  cmp    %r12d,%r13d
  jne    L188
L86:
  cmp    $0x2,%ebp
  sete   %r12b
  movzbl %r12b,%r12d
  lea    0x6(%r12,%r12,1),%r12d
  setne  %r13b
  movzbl %r13b,%r13d
  lea    0x9(%r13,%r13,1),%r13d
  lea    0xc(%rsp),%rdi
  mov    %rbx,%rax
  lea    -0x8(,%r13,8),%r10d
  mov    $0x0,%r8d
  mov    $0x80,%r9d
  jmp    L144
L288:
  lea    D12(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcat@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  mov    %r14d,%r13d
  sub    %eax,%r13d
  cmp    $0x4,%r13d
  jg     L6
  test   %r13d,%r13d
  jle    L86
  mov    $0x0,%r12d
  lea    D0(%rip),%r14
L316:
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <strcat@plt>
  add    $0x1,%r12d
  cmp    %r12d,%r13d
  jne    L316
  jmp    L86
L106:
  add    $0x1,%rcx
  cmp    $0x8,%rcx
  je     L329
L12:
  cmpb   $0x31,(%rax,%rcx,1)
  jne    L106
  mov    %r9d,%esi
  sar    %cl,%esi
  add    %sil,(%rdx)
  jmp    L106
L329:
  add    $0x1,%rdi
  add    $0x8,%r8d
  add    $0x8,%rax
  cmp    %r10d,%r8d
  je     L177
L144:
  mov    %rdi,%rdx
  movb   $0x0,(%rdi)
  mov    $0x0,%ecx
  jmp    L12
L177:
  cmp    $0x1,%ebp
  je     L191
  cmp    $0x2,%ebp
  je     L121
L257:
  mov    $0x11d,%edi
  call   <rs_init_gf@plt>
  mov    $0x0,%esi
  mov    %r12d,%edi
  call   <rs_init_code@plt>
  lea    0x3(%rsp),%rbp
  lea    0xc(%rsp),%rsi
  mov    %rbp,%rdx
  mov    %r13d,%edi
  call   <rs_encode@plt>
  mov    $0x0,%eax
  call   <rs_free@plt>
  movslq %r12d,%rax
  add    %rax,%rbp
  lea    0x2(%rsp,%rax,1),%rax
  lea    -0x1(%r12),%edx
  sub    %rdx,%rax
  mov    %rax,%r12
L66:
  movzbl -0x1(%rbp),%esi
  mov    $0x80,%edx
  mov    %rbx,%rdi
  call   <qr_diran@plt>
  sub    $0x1,%rbp
  cmp    %r12,%rbp
  jne    L66
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L323
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L191:
  movb   $0x0,0x16(%rsp)
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%eax
  mov    $0x80,%edi
  mov    $0x1,%esi
  jmp    L51
L80:
  add    $0x1,%rcx
  cmp    $0x4,%rcx
  je     L208
L51:
  cmpb   $0x31,0x50(%rbx,%rcx,1)
  jne    L80
  mov    %edi,%edx
  sar    %cl,%edx
  add    %edx,%eax
  mov    %esi,%edx
  jmp    L80
L121:
  movb   $0x0,0x14(%rsp)
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%eax
  mov    $0x80,%edi
  mov    $0x1,%esi
  jmp    L73
L65:
  add    $0x1,%rcx
  cmp    $0x4,%rcx
  je     L262
L73:
  cmpb   $0x31,0x40(%rbx,%rcx,1)
  jne    L65
  mov    %edi,%edx
  sar    %cl,%edx
  add    %edx,%eax
  mov    %esi,%edx
  jmp    L65
L262:
  test   %dl,%dl
  je     L257
  mov    %al,0x14(%rsp)
  jmp    L257
L208:
  test   %dl,%dl
  je     L257
  mov    %al,0x16(%rsp)
  jmp    L257
L6:
  mov    %rbx,%rdi
  call   <strlen@plt>
  cltd
  shr    $0x1d,%edx
  add    %edx,%eax
  and    $0x7,%eax
  sub    %eax,%edx
  lea    0x8(%rdx),%r13d
  mov    $0x0,%r12d
  lea    D0(%rip),%r15
  je     L28
L293:
  mov    %r15,%rsi
  mov    %rbx,%rdi
  call   <strcat@plt>
  add    $0x1,%r12d
  cmp    %r12d,%r13d
  jne    L293
L28:
  mov    %rbx,%rdi
  call   <strlen@plt>
  sub    %eax,%r14d
  cmp    $0x4,%r14d
  jle    L168
  lea    0x3(%r14),%r13d
  mov    %r14d,%eax
  sub    $0x4,%eax
  cmovns %eax,%r13d
  sar    $0x3,%r13d
  cmp    $0xb,%r14d
  jle    L168
  mov    $0x0,%r12d
  lea    D43(%rip),%r15
  lea    D40(%rip),%r14
L141:
  test   $0x1,%r12b
  mov    %r14,%rsi
  cmovne %r15,%rsi
  mov    %rbx,%rdi
  call   <strcat@plt>
  add    $0x1,%r12d
  cmp    %r12d,%r13d
  jg     L141
L168:
  lea    D4(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcat@plt>
  jmp    L86
L323:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D0
type: string
name: retrieve_data
arguments: data_label: D12
type: string
name: retrieve_data
arguments: data_label: D43
type: string
name: retrieve_data
arguments: data_label: D40
type: string
name: retrieve_data
arguments: data_label: D4
type: string

tool: D0: 0

tool: D12: 0000000

tool: D43: 00010001

tool: D40: 11101100

tool: D4: 0000

assistant: ```c
void micro_qr_m3(char binary_data[], int ecc_mode) {
  int i, j, latch;
  int bits_total, bits_left, remainder;
  int data_codewords, ecc_codewords;
  unsigned char data_blocks[12], ecc_blocks[9];
  latch = 0;
  if (ecc_mode == 1) {
    bits_total = 84;
  }
  if (ecc_mode == 2) {
    bits_total = 68;
  }
  bits_left = bits_total - strlen(binary_data);
  if (bits_left <= 7) {
    for (i = 0; i < bits_left; i++) {
      strcat(binary_data, "0");
    }
    latch = 1;
  } else {
    strcat(binary_data, "0000000");
  }
  if (latch == 0) {
    bits_left = bits_total - strlen(binary_data);
    if (bits_left <= 4) {
      for (i = 0; i < bits_left; i++) {
        strcat(binary_data, "0");
      }
      latch = 1;
    }
  }
  if (latch == 0) {
    remainder = 8 - (strlen(binary_data) % 8);
    if (remainder == 8) {
      remainder = 0;
    }
    for (i = 0; i < remainder; i++) {
      strcat(binary_data, "0");
    }
    bits_left = bits_total - strlen(binary_data);
    if (bits_left > 4) {
      remainder = (bits_left - 4) / 8;
      for (i = 0; i < remainder; i++) {
        strcat(binary_data, i & 1 ? "00010001" : "11101100");
      }
    }
    strcat(binary_data, "0000");
  }
  if (ecc_mode == 1) {
    data_codewords = 11;
    ecc_codewords = 6;
  }
  if (ecc_mode == 2) {
    data_codewords = 9;
    ecc_codewords = 8;
  }
  for (i = 0; i < (data_codewords - 1); i++) {
    data_blocks[i] = 0;
    for (j = 0; j < 8; j++) {
      if (binary_data[(i * 8) + j] == '1') {
        data_blocks[i] += 0x80 >> j;
      }
    }
  }
  if (ecc_mode == 1) {
    data_blocks[10] = 0;
    for (j = 0; j < 4; j++) {
      if (binary_data[80 + j] == '1') {
        data_blocks[10] += 0x80 >> j;
      }
    }
  }
  if (ecc_mode == 2) {
    data_blocks[8] = 0;
    for (j = 0; j < 4; j++) {
      if (binary_data[64 + j] == '1') {
        data_blocks[8] += 0x80 >> j;
      }
    }
  }
  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;
}
```