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

```asm
<tlsext_cb>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %edx,%eax
  mov    %rcx,%r12
  mov    %r8d,%ebp
  mov    %r9,%rbx
  lea    -0x80(%rdx),%edx
  cmp    $0x11,%edx
  ja     L34
  mov    %edx,%edx
  lea    D107(%rip),%rcx
  movslq (%rcx,%rdx,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  lea    D25(%rip),%rdi
L148:
  test   %esi,%esi
  lea    D73(%rip),%rdx
  lea    D224(%rip),%rcx
  cmove  %rcx,%rdx
  mov    %ebp,%r9d
  mov    %eax,%r8d
  mov    %rdi,%rcx
  lea    D127(%rip),%rsi
  mov    %rbx,%rdi
  call   <BIO_printf@plt>
  mov    %ebp,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <BIO_dump@plt>
  mov    %rbx,%rdi
  call   <BIO_flush@plt>
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  lea    D216(%rip),%rdi
  jmp    L148
  lea    D188(%rip),%rdi
  jmp    L148
  lea    D194(%rip),%rdi
  jmp    L148
  lea    D175(%rip),%rdi
  jmp    L148
  lea    D164(%rip),%rdi
  jmp    L148
  lea    D158(%rip),%rdi
  jmp    L148
  lea    D106(%rip),%rdi
  jmp    L148
  lea    D46(%rip),%rdi
  jmp    L148
  lea    D112(%rip),%rdi
  jmp    L148
  lea    D101(%rip),%rdi
  jmp    L148
  lea    D139(%rip),%rdi
  jmp    L148
  lea    D186(%rip),%rdi
  jmp    L148
  lea    D170(%rip),%rdi
  jmp    L148
  lea    D53(%rip),%rdi
  jmp    L148
  lea    D60(%rip),%rdi
  jmp    L148
  lea    D210(%rip),%rdi
  jmp    L148
L34:
  lea    D169(%rip),%rdi
  jmp    L148
  lea    D144(%rip),%rdi
  jmp    L148
```

tool_calls: name: extract_symbolic_data
arguments: label: D25
type: string
name: extract_symbolic_data
arguments: label: D73
type: string
name: extract_symbolic_data
arguments: label: D224
type: string
name: extract_symbolic_data
arguments: label: D127
type: string
name: extract_symbolic_data
arguments: label: D216
type: string
name: extract_symbolic_data
arguments: label: D188
type: string
name: extract_symbolic_data
arguments: label: D194
type: string
name: extract_symbolic_data
arguments: label: D175
type: string
name: extract_symbolic_data
arguments: label: D164
type: string
name: extract_symbolic_data
arguments: label: D158
type: string
name: extract_symbolic_data
arguments: label: D106
type: string
name: extract_symbolic_data
arguments: label: D46
type: string
name: extract_symbolic_data
arguments: label: D112
type: string
name: extract_symbolic_data
arguments: label: D101
type: string
name: extract_symbolic_data
arguments: label: D139
type: string
name: extract_symbolic_data
arguments: label: D186
type: string
name: extract_symbolic_data
arguments: label: D170
type: string
name: extract_symbolic_data
arguments: label: D53
type: string
name: extract_symbolic_data
arguments: label: D60
type: string
name: extract_symbolic_data
arguments: label: D210
type: string
name: extract_symbolic_data
arguments: label: D169
type: string
name: extract_symbolic_data
arguments: label: D144
type: string

tool: D25: max fragment length

tool: D73: server

tool: D224: client

tool: D127: TLS %s extension "%s" (id=%d), len=%d


tool: D216: client certificate URL

tool: D188: trusted CA keys

tool: D194: truncated HMAC

tool: D175: status request

tool: D164: user mapping

tool: D158: client authz

tool: D106: server authz

tool: D46: cert type

tool: D112: elliptic curves

tool: D101: EC point formats

tool: D139: SRP

tool: D186: signature algorithms

tool: D170: use SRTP

tool: D53: heartbeat

tool: D60: session ticket

tool: D210: renegotiation info

tool: D169: unknown

tool: D144: server name

assistant: ```c
void tlsext_cb(SSL *s, int client_server, int type, unsigned char *data, int len, void *arg) {
  BIO *bio = arg;
  char *extname;
  switch (type) {
  case TLSEXT_TYPE_server_name:
    extname = "server name";
    break;
  case TLSEXT_TYPE_max_fragment_length:
    extname = "max fragment length";
    break;
  case TLSEXT_TYPE_client_certificate_url:
    extname = "client certificate URL";
    break;
  case TLSEXT_TYPE_trusted_ca_keys:
    extname = "trusted CA keys";
    break;
  case TLSEXT_TYPE_truncated_hmac:
    extname = "truncated HMAC";
    break;
  case TLSEXT_TYPE_status_request:
    extname = "status request";
    break;
  case TLSEXT_TYPE_user_mapping:
    extname = "user mapping";
    break;
  case TLSEXT_TYPE_client_authz:
    extname = "client authz";
    break;
  case TLSEXT_TYPE_server_authz:
    extname = "server authz";
    break;
  case TLSEXT_TYPE_cert_type:
    extname = "cert type";
    break;
  case TLSEXT_TYPE_elliptic_curves:
    extname = "elliptic curves";
    break;
  case TLSEXT_TYPE_ec_point_formats:
    extname = "EC point formats";
    break;
  case TLSEXT_TYPE_srp:
    extname = "SRP";
    break;
  case TLSEXT_TYPE_signature_algorithms:
    extname = "signature algorithms";
    break;
  case TLSEXT_TYPE_use_srtp:
    extname = "use SRTP";
    break;
  case TLSEXT_TYPE_heartbeat:
    extname = "heartbeat";
    break;
  case TLSEXT_TYPE_session_ticket:
    extname = "session ticket";
    break;
  case TLSEXT_TYPE_renegotiate:
    extname = "renegotiation info";
    break;
  default:
    extname = "unknown";
    break;
  }
  BIO_printf(bio, "TLS %s extension \"%s\" (id=%d), len=%d\n", client_server ? "server" : "client", extname, type, len);
  BIO_dump(bio, (char *)data, len);
  (void)BIO_flush(bio);
}
```