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

```asm
<coupon_vli>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %rcx,%r14
  mov    %rdx,%r15
  sub    %rdi,%r15
  movslq %esi,%r12
  cmp    %r12,%r15
  jge    L28
  mov    %rdx,%rbx
  mov    %r8d,%ebp
  mov    %r9d,%r13d
  mov    $0x1,%esi
  mov    %rdx,%rdi
  call   <to_int@plt>
  cmp    %r13d,%eax
  jl     L123
  cmp    0x50(%rsp),%eax
  jg     L123
  add    $0x1,%rbx
  cmp    $0x9,%eax
  jne    L13
  cmpl   $0x0,0x58(%rsp)
  jne    L165
L13:
  mov    %rbx,%rcx
  sub    0x8(%rsp),%rcx
  movslq %eax,%rdx
  add    %rcx,%rdx
  movslq %ebp,%rsi
  add    %rsi,%rdx
  cmp    %rdx,%r12
  jl     L0
  cltq
  movslq %ebp,%rbp
  add    %rbp,%rax
  lea    (%rbx,%rax,1),%rdx
  cmp    %rdx,%rbx
  jae    L55
L124:
  movzbl (%rbx),%eax
  sub    $0x30,%eax
  cmp    $0x9,%al
  ja     L173
  add    $0x1,%rbx
  cmp    %rbx,%rdx
  jne    L124
  jmp    L146
L28:
  mov    0x60(%rsp),%rax
  movl   $0x3,(%rax)
  add    $0x1,%r15d
  mov    0x68(%rsp),%rax
  mov    %r15d,(%rax)
  mov    %rcx,%rdx
  lea    D11(%rip),%rsi
  mov    0x70(%rsp),%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  mov    $0x0,%edx
  jmp    L146
L123:
  cmp    $0x9,%eax
  jne    L33
  cmpl   $0x0,0x58(%rsp)
  sete   %cl
  lea    0x1(%rbx),%rdx
  test   %cl,%cl
  jne    L33
L146:
  mov    %rdx,%rax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L33:
  mov    0x60(%rsp),%rsi
  movl   $0x3,(%rsi)
  add    $0x1,%r15d
  mov    0x68(%rsp),%rcx
  mov    %r15d,(%rcx)
  movzbl (%rbx),%ecx
  test   %eax,%eax
  lea    D17(%rip),%rsi
  lea    D39(%rip),%rax
  cmovns %rax,%rsi
  mov    %r14,%rdx
  mov    0x70(%rsp),%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  mov    $0x0,%edx
  jmp    L146
L0:
  mov    0x60(%rsp),%rax
  movl   $0x3,(%rax)
  add    $0x1,%ecx
  mov    0x68(%rsp),%rax
  mov    %ecx,(%rax)
  mov    %r14,%rdx
  lea    D19(%rip),%rsi
  mov    0x70(%rsp),%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  mov    $0x0,%edx
  jmp    L146
L173:
  mov    0x60(%rsp),%rax
  movl   $0x3,(%rax)
  mov    %rbx,%rax
  sub    0x8(%rsp),%rax
  add    $0x1,%eax
  mov    0x68(%rsp),%rsi
  mov    %eax,(%rsi)
  movzbl (%rbx),%ecx
  mov    %r14,%rdx
  lea    D37(%rip),%rsi
  mov    0x70(%rsp),%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  mov    $0x0,%edx
  jmp    L146
L165:
  mov    %rbx,%rdx
  jmp    L146
L55:
  mov    %rbx,%rdx
  jmp    L146
```

tool_calls: name: unpack_data
arguments: data_tag: D11
type_guessed: string
name: unpack_data
arguments: data_tag: D17
type_guessed: string
name: unpack_data
arguments: data_tag: D39
type_guessed: string
name: unpack_data
arguments: data_tag: D19
type_guessed: string
name: unpack_data
arguments: data_tag: D37
type_guessed: string

tool: D11: %s VLI missing

tool: D17: Non-numeric %s VLI '%c'

tool: D39: Invalid %s VLI '%c'

tool: D19: %s incomplete

tool: D37: Non-numeric %s '%c'

assistant: ```c
const unsigned char *coupon_vli(const unsigned char *data, const int data_len, const unsigned char *d, const char *name, const int vli_offset, const int vli_min, const int vli_max, const int vli_nine, int *p_err_no, int *p_err_posn, char err_msg[50]) {
  const unsigned char *de;
  int vli;
  if (d - data + 1 > data_len) {
    *p_err_no = 3;
    *p_err_posn = d - data + 1;
    sprintf(err_msg, "%s VLI missing", name);
    return NULL;
  }
  vli = to_int(d, 1);
  if ((vli < vli_min || vli > vli_max) && (vli != 9 || !vli_nine)) {
    *p_err_no = 3;
    *p_err_posn = d - data + 1;
    sprintf(err_msg, vli < 0 ? "Non-numeric %s VLI '%c'" : "Invalid %s VLI '%c'", name, *d);
    return NULL;
  }
  d++;
  if (vli != 9 || !vli_nine) {
    if (d - data + vli + vli_offset > data_len) {
      *p_err_no = 3;
      *p_err_posn = d - data + 1;
      sprintf(err_msg, "%s incomplete", name);
      return NULL;
    }
    de = d + vli + vli_offset;
    for (; d < de; d++) {
      if (*d < '0' || *d > '9') {
        *p_err_no = 3;
        *p_err_posn = d - data + 1;
        sprintf(err_msg, "Non-numeric %s '%c'", name, *d);
        return NULL;
      }
    }
  }
  return d;
}
```