user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<oligodg>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r12
  push   %rbx
  sub    $0x20,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    $0x0,%ebx
  cmpl   $0x0,-0x2c(%rbp)
  je     L557
  cmpl   $0x1,-0x2c(%rbp)
  je     L557
  movsd  D29(%rip),%xmm0
  jmp    L775
L557:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  je     L642
  mov    $0xfffff858,%ebx
  cmp    $0x41,%r12b
  je     L936
  cmp    $0x54,%r12b
  jne    L1237
L936:
  sub    $0x32,%ebx
L1237:
  cmp    $0x41,%r12b
  jne    L992
  jmp    L1074
L992:
  cmp    $0x47,%r12b
  je     L1473
  cmp    $0x54,%r12b
  je     L1243
  cmp    $0x43,%r12b
  je     L467
  cmp    $0x4e,%r12b
  jne    L721
  jmp    L233
L1074:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L1216
  add    $0x3e8,%ebx
  jmp    L1074
L1216:
  cmp    $0x54,%r12b
  jne    L330
  add    $0x370,%ebx
  jmp    L1004
L330:
  cmp    $0x47,%r12b
  jne    L423
  add    $0x500,%ebx
  jmp    L1037
L423:
  cmp    $0x43,%r12b
  jne    L819
  add    $0x5a0,%ebx
  jmp    L41
L819:
  cmp    $0x4e,%r12b
  jne    L1231
  add    $0x370,%ebx
  jmp    L233
L1231:
  test   %r12b,%r12b
  jne    L1016
  jmp    L170
L1243:
  nop
L1004:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L1252
  add    $0x244,%ebx
  jmp    L1074
L1252:
  cmp    $0x54,%r12b
  jne    L83
  add    $0x3e8,%ebx
  jmp    L1004
L83:
  cmp    $0x47,%r12b
  jne    L1185
  add    $0x5aa,%ebx
  jmp    L1037
L1185:
  cmp    $0x43,%r12b
  jne    L142
  add    $0x514,%ebx
  jmp    L41
L142:
  cmp    $0x4e,%r12b
  jne    L974
  add    $0x244,%ebx
  jmp    L233
L974:
  test   %r12b,%r12b
  jne    L13
  jmp    L170
L1473:
  nop
L1037:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L381
  add    $0x514,%ebx
  jmp    L1074
L381:
  cmp    $0x54,%r12b
  jne    L504
  add    $0x5a0,%ebx
  jmp    L1004
L504:
  cmp    $0x47,%r12b
  jne    L926
  add    $0x730,%ebx
  jmp    L1037
L926:
  cmp    $0x43,%r12b
  jne    L1422
  add    $0x8c0,%ebx
  jmp    L41
L1422:
  cmp    $0x4e,%r12b
  jne    L487
  add    $0x514,%ebx
  jmp    L233
L487:
  test   %r12b,%r12b
  jne    L553
  jmp    L170
L467:
  nop
L41:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L1536
  add    $0x5aa,%ebx
  jmp    L1074
L1536:
  cmp    $0x54,%r12b
  jne    L416
  add    $0x500,%ebx
  jmp    L1004
L416:
  cmp    $0x47,%r12b
  jne    L437
  add    $0x87a,%ebx
  jmp    L1037
L437:
  cmp    $0x43,%r12b
  jne    L1491
  add    $0x730,%ebx
  jmp    L41
L1491:
  cmp    $0x4e,%r12b
  jne    L1290
  add    $0x5aa,%ebx
  jmp    L233
L1290:
  test   %r12b,%r12b
  jne    L601
  jmp    L170
L233:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L471
  add    $0x244,%ebx
  jmp    L1074
L471:
  cmp    $0x54,%r12b
  jne    L490
  add    $0x370,%ebx
  jmp    L1004
L490:
  cmp    $0x47,%r12b
  jne    L1091
  add    $0x500,%ebx
  jmp    L1037
L1091:
  cmp    $0x43,%r12b
  jne    L704
  add    $0x514,%ebx
  jmp    L41
L704:
  cmp    $0x4e,%r12b
  jne    L1419
  add    $0x244,%ebx
  jmp    L233
L1419:
  test   %r12b,%r12b
  jne    L378
  jmp    L170
L642:
  cmp    $0x41,%r12b
  jne    L980
  jmp    L708
L980:
  cmp    $0x47,%r12b
  je     L232
  cmp    $0x54,%r12b
  je     L27
  cmp    $0x43,%r12b
  je     L1250
  cmp    $0x4e,%r12b
  jne    L1508
  jmp    L1113
L708:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L446
  add    $0x76c,%ebx
  jmp    L708
L446:
  cmp    $0x54,%r12b
  jne    L1050
  add    $0x5dc,%ebx
  jmp    L650
L1050:
  cmp    $0x47,%r12b
  jne    L1097
  add    $0x640,%ebx
  jmp    L1393
L1097:
  cmp    $0x43,%r12b
  jne    L836
  add    $0x514,%ebx
  jmp    L94
L836:
  cmp    $0x4e,%r12b
  jne    L153
  add    $0x627,%ebx
  jmp    L1113
L153:
  test   %r12b,%r12b
  jne    L244
  jmp    L170
L27:
  nop
L650:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L1220
  add    $0x384,%ebx
  jmp    L708
L1220:
  cmp    $0x54,%r12b
  jne    L397
  add    $0x76c,%ebx
  jmp    L650
L397:
  cmp    $0x47,%r12b
  jne    L632
  add    $0x76c,%ebx
  jmp    L1393
L632:
  cmp    $0x43,%r12b
  jne    L321
  add    $0x640,%ebx
  jmp    L94
L321:
  cmp    $0x4e,%r12b
  jne    L886
  add    $0x627,%ebx
  jmp    L1113
L886:
  test   %r12b,%r12b
  jne    L928
  jmp    L170
L232:
  nop
L1393:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L1462
  add    $0x640,%ebx
  jmp    L708
L1462:
  cmp    $0x54,%r12b
  jne    L176
  add    $0x514,%ebx
  jmp    L650
L176:
  cmp    $0x47,%r12b
  jne    L516
  add    $0xc1c,%ebx
  jmp    L1393
L516:
  cmp    $0x43,%r12b
  jne    L1524
  add    $0xc1c,%ebx
  jmp    L94
L1524:
  cmp    $0x4e,%r12b
  jne    L67
  add    $0x8e3,%ebx
  jmp    L1113
L67:
  test   %r12b,%r12b
  jne    L1082
  jmp    L170
L1250:
  nop
L94:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L539
  add    $0x76c,%ebx
  jmp    L708
L539:
  cmp    $0x54,%r12b
  jne    L173
  add    $0x640,%ebx
  jmp    L650
L173:
  cmp    $0x47,%r12b
  jne    L1042
  add    $0xe10,%ebx
  jmp    L1393
L1042:
  cmp    $0x43,%r12b
  jne    L661
  add    $0xc1c,%ebx
  jmp    L94
L661:
  cmp    $0x4e,%r12b
  jne    L994
  add    $0x9f6,%ebx
  jmp    L1113
L994:
  test   %r12b,%r12b
  jne    L1475
  jmp    L170
L1113:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  addq   $0x1,-0x28(%rbp)
  cmp    $0x41,%r12b
  jne    L977
  add    $0x627,%ebx
  jmp    L708
L977:
  cmp    $0x54,%r12b
  jne    L1516
  add    $0x627,%ebx
  jmp    L650
L1516:
  cmp    $0x47,%r12b
  jne    L320
  add    $0x9f6,%ebx
  jmp    L1393
L320:
  cmp    $0x43,%r12b
  jne    L87
  add    $0x8e3,%ebx
  jmp    L94
L87:
  cmp    $0x4e,%r12b
  jne    L1464
  add    $0x7ca,%ebx
  jmp    L1113
L1464:
  test   %r12b,%r12b
  jne    L1369
  nop
L170:
  cmpl   $0x0,-0x2c(%rbp)
  je     L1102
  subq   $0x1,-0x28(%rbp)
  subq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%r12d
  cmp    $0x41,%r12b
  je     L167
  cmp    $0x54,%r12b
  jne    L818
L167:
  sub    $0x32,%ebx
L818:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <symmetry@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x1,-0x14(%rbp)
  jne    L1102
  sub    $0x1ae,%ebx
L1102:
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  movsd  D10(%rip),%xmm1
  divsd  %xmm1,%xmm0
  jmp    L775
L721:
  nop
  jmp    L1454
L1016:
  nop
  jmp    L1454
L13:
  nop
  jmp    L1454
L553:
  nop
  jmp    L1454
L601:
  nop
  jmp    L1454
L378:
  nop
  jmp    L1454
L1508:
  nop
  jmp    L1454
L244:
  nop
  jmp    L1454
L928:
  nop
  jmp    L1454
L1082:
  nop
  jmp    L1454
L1475:
  nop
  jmp    L1454
L1369:
  nop
L1454:
  movsd  D29(%rip),%xmm0
L775:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  add    $0x20,%rsp
  pop    %rbx
  pop    %r12
  pop    %rbp
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D29
type: byte[8]
name: disassemble_data
arguments: tag: D10
type: f64

tool: {"D29": [0x8f,0xe4,0xf2,0xff,0x7f,0x84,0x2e,0xc1]}

tool: D10: 1000

assistant: ```c
double oligodg(s, tm_santalucia) const char *s;
int tm_santalucia;
{
  register int dg = 0;
  register char c;
  if (tm_santalucia != 0 && tm_santalucia != 1)
    return -999999.9999;
  c = *s;
  s++;
  if (tm_santalucia != 0) {
    dg = -1960;
    if (c == 'A' || c == 'T') {
      dg += -50;
    }
    if (c == 'A')
      goto A_STATE2;
    else if (c == 'G')
      goto G_STATE2;
    else if (c == 'T')
      goto T_STATE2;
    else if (c == 'C')
      goto C_STATE2;
    else if (c == 'N')
      goto N_STATE2;
    else
      goto ERROR;
  A_STATE2:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 1000;
      goto A_STATE2;
    } else if ('T' == c) {
      dg += 880;
      goto T_STATE2;
    } else if ('G' == c) {
      dg += 1280;
      goto G_STATE2;
    } else if ('C' == c) {
      dg += 1440;
      goto C_STATE2;
    } else if ('N' == c) {
      dg += 880;
      goto N_STATE2;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  T_STATE2:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 580;
      goto A_STATE2;
    } else if ('T' == c) {
      dg += 1000;
      goto T_STATE2;
    } else if ('G' == c) {
      dg += 1450;
      goto G_STATE2;
    } else if ('C' == c) {
      dg += 1300;
      goto C_STATE2;
    } else if ('N' == c) {
      dg += 580;
      goto N_STATE2;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  G_STATE2:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 1300;
      goto A_STATE2;
    } else if ('T' == c) {
      dg += 1440;
      goto T_STATE2;
    } else if ('G' == c) {
      dg += 1840;
      goto G_STATE2;
    } else if ('C' == c) {
      dg += 2240;
      goto C_STATE2;
    } else if ('N' == c) {
      dg += 1300;
      goto N_STATE2;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  C_STATE2:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 1450;
      goto A_STATE2;
    } else if ('T' == c) {
      dg += 1280;
      goto T_STATE2;
    } else if ('G' == c) {
      dg += 2170;
      goto G_STATE2;
    } else if ('C' == c) {
      dg += 1840;
      goto C_STATE2;
    } else if ('N' == c) {
      dg += 1450;
      goto N_STATE2;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  N_STATE2:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 580;
      goto A_STATE2;
    } else if ('T' == c) {
      dg += 880;
      goto T_STATE2;
    } else if ('G' == c) {
      dg += 1280;
      goto G_STATE2;
    } else if ('C' == c) {
      dg += 1300;
      goto C_STATE2;
    } else if ('N' == c) {
      dg += 580;
      goto N_STATE2;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  } else {
    if (c == 'A')
      goto A_STATE;
    else if (c == 'G')
      goto G_STATE;
    else if (c == 'T')
      goto T_STATE;
    else if (c == 'C')
      goto C_STATE;
    else if (c == 'N')
      goto N_STATE;
    else
      goto ERROR;
  A_STATE:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 1900;
      goto A_STATE;
    } else if ('T' == c) {
      dg += 1500;
      goto T_STATE;
    } else if ('G' == c) {
      dg += 1600;
      goto G_STATE;
    } else if ('C' == c) {
      dg += 1300;
      goto C_STATE;
    } else if ('N' == c) {
      dg += 1575;
      goto N_STATE;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  T_STATE:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 900;
      goto A_STATE;
    } else if ('T' == c) {
      dg += 1900;
      goto T_STATE;
    } else if ('G' == c) {
      dg += 1900;
      goto G_STATE;
    } else if ('C' == c) {
      dg += 1600;
      goto C_STATE;
    } else if ('N' == c) {
      dg += 1575;
      goto N_STATE;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  G_STATE:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 1600;
      goto A_STATE;
    } else if ('T' == c) {
      dg += 1300;
      goto T_STATE;
    } else if ('G' == c) {
      dg += 3100;
      goto G_STATE;
    } else if ('C' == c) {
      dg += 3100;
      goto C_STATE;
    } else if ('N' == c) {
      dg += 2275;
      goto N_STATE;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  C_STATE:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 1900;
      goto A_STATE;
    } else if ('T' == c) {
      dg += 1600;
      goto T_STATE;
    } else if ('G' == c) {
      dg += 3600;
      goto G_STATE;
    } else if ('C' == c) {
      dg += 3100;
      goto C_STATE;
    } else if ('N' == c) {
      dg += 2550;
      goto N_STATE;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  N_STATE:
    c = *s;
    s++;
    if ('A' == c) {
      dg += 1575;
      goto A_STATE;
    } else if ('T' == c) {
      dg += 1575;
      goto T_STATE;
    } else if ('G' == c) {
      dg += 2550;
      goto G_STATE;
    } else if ('C' == c) {
      dg += 2275;
      goto C_STATE;
    } else if ('N' == c) {
      dg += 1994;
      goto N_STATE;
    } else if ('\0' == c)
      goto DONE;
    else
      goto ERROR;
  }
DONE:
  if (tm_santalucia != 0) {
    int sym;
    --s;
    --s;
    c = *s;
    if (c == 'A' || c == 'T') {
      dg += -50;
    }
    sym = symmetry(s);
    if (sym == 1) {
      dg += -430;
    }
  }
  return dg / 1000.0;
ERROR:
  return -999999.9999;
}
```