user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<ax25_frame>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x100,%rsp
  mov    %rdi,-0xd8(%rbp)
  mov    %rsi,-0xe0(%rbp)
  mov    %rdx,-0xe8(%rbp)
  mov    %ecx,%edx
  mov    %r8,-0xf8(%rbp)
  mov    %r9d,%edi
  mov    0x10(%rbp),%esi
  mov    0x18(%rbp),%ecx
  test   %al,%al
  je     L50
  movaps %xmm0,-0x80(%rbp)
  movaps %xmm1,-0x70(%rbp)
  movaps %xmm2,-0x60(%rbp)
  movaps %xmm3,-0x50(%rbp)
  movaps %xmm4,-0x40(%rbp)
  movaps %xmm5,-0x30(%rbp)
  movaps %xmm6,-0x20(%rbp)
  movaps %xmm7,-0x10(%rbp)
L50:
  mov    %edx,%eax
  mov    %al,-0xec(%rbp)
  mov    %edi,%eax
  mov    %al,-0xf0(%rbp)
  mov    %esi,%eax
  mov    %al,-0xfc(%rbp)
  mov    %ecx,%eax
  mov    %al,-0x100(%rbp)
  mov    0x20(%rbp),%rdx
  mov    -0xbc(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <va_start@plt>
  movsbl -0xf0(%rbp),%edx
  mov    -0xf8(%rbp),%rcx
  mov    -0xd8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <_ax25_callsign@plt>
  mov    %rax,-0xb8(%rbp)
  movsbl -0xec(%rbp),%edx
  mov    -0xe8(%rbp),%rcx
  mov    -0xb8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <_ax25_callsign@plt>
  mov    %rax,-0xb8(%rbp)
  cmpb   $0x0,-0xfc(%rbp)
  je     L54
  movsbl -0xfc(%rbp),%edx
  mov    -0xb8(%rbp),%rax
  lea    D13(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <_ax25_callsign@plt>
  mov    %rax,-0xb8(%rbp)
L54:
  cmpb   $0x0,-0x100(%rbp)
  je     L78
  movsbl -0x100(%rbp),%edx
  mov    -0xb8(%rbp),%rax
  lea    D11(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <_ax25_callsign@plt>
  mov    %rax,-0xb8(%rbp)
L78:
  mov    -0xb8(%rbp),%rax
  sub    $0x4,%rax
  mov    (%rax),%edx
  mov    -0xb8(%rbp),%rax
  sub    $0x4,%rax
  or     $0x1,%edx
  mov    %edx,(%rax)
  mov    -0xb8(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0xb8(%rbp)
  movl   $0x3,(%rax)
  mov    -0xb8(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0xb8(%rbp)
  movl   $0xf0,(%rax)
  mov    -0xb8(%rbp),%rax
  sub    -0xd8(%rbp),%rax
  sar    $0x2,%rax
  neg    %rax
  add    $0xc6,%eax
  mov    %eax,%esi
  mov    -0xbc(%rbp),%ecx
  mov    0x20(%rbp),%rdx
  mov    -0xb8(%rbp),%rax
  mov    %rax,%rdi
  call   <vsnprintf@plt>
  mov    -0xbc(%rbp),%eax
  mov    %eax,%edi
  call   <va_end@plt>
  movl   $0xffff,-0xc0(%rbp)
  mov    -0xd8(%rbp),%rax
  mov    %rax,-0xb8(%rbp)
  jmp    L47
L69:
  mov    -0xb8(%rbp),%rax
  mov    (%rax),%eax
  xor    %eax,-0xc0(%rbp)
  movl   $0x0,-0xc4(%rbp)
  jmp    L6
L7:
  mov    -0xc0(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L48
  mov    -0xc0(%rbp),%eax
  shr    %eax
  xor    $0x8408,%eax
  mov    %eax,-0xc0(%rbp)
  jmp    L55
L48:
  shrl   -0xc0(%rbp)
L55:
  addl   $0x1,-0xc4(%rbp)
L6:
  cmpl   $0x7,-0xc4(%rbp)
  jle    L7
  addq   $0x4,-0xb8(%rbp)
L47:
  mov    -0xb8(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L69
  mov    -0xc0(%rbp),%eax
  movzbl %al,%eax
  not    %eax
  mov    %eax,%ecx
  mov    -0xb8(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0xb8(%rbp)
  mov    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0xc0(%rbp),%eax
  shr    $0x8,%eax
  movzbl %al,%eax
  not    %eax
  mov    %eax,%ecx
  mov    -0xb8(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0xb8(%rbp)
  mov    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0xb8(%rbp),%rax
  sub    -0xd8(%rbp),%rax
  sar    $0x2,%rax
  mov    %eax,%edx
  mov    -0xe0(%rbp),%rax
  mov    %edx,(%rax)
  nop
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D13
type: string
name: retrieve_data
arguments: label: D11
type: string

tool: D13: WIDE1

tool: D11: WIDE2

assistant: ```c
void ax25_frame(uint8_t *frame, int *length, char *scallsign, char sssid, char *dcallsign, char dssid, char ttl1, char ttl2, char *data, ...) {
  uint8_t *s, j;
  uint16_t CRC;
  va_list va;
  va_start(va, data);
  s = _ax25_callsign(frame, dcallsign, dssid);
  s = _ax25_callsign(s, scallsign, sssid);
  if (ttl1)
    s = _ax25_callsign(s, "WIDE1", ttl1);
  if (ttl2)
    s = _ax25_callsign(s, "WIDE2", ttl2);
  s[-1] |= 1;
  *(s++) = 0x03;
  *(s++) = 0xF0;
  vsnprintf((char *)s, 200 - (s - frame) - 2, data, va);
  va_end(va);
  for (CRC = 0xffff, s = frame; *s; s++) {
    CRC ^= ((unsigned int)*s);
    for (j = 0; j < 8; j++) {
      if (CRC & 1) {
        CRC = (CRC >> 1) ^ 0x8408;
      } else {
        CRC >>= 1;
      }
    }
  }
  *(s++) = ~(CRC & 0xFF);
  *(s++) = ~((CRC >> 8) & 0xFF);
  *length = s - frame;
}
```