user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %r12
  lea    D20(%rip),%rdi
  push   %rbp
  sub    $0xc8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xb8(%rsp)
  movabs $0x30302e303030302b,%rax
  lea    0x41(%rsp),%rbp
  movb   $0x0,0x4b(%rsp)
  lea    0x11(%rsp),%r12
  movl   $0x303030,0x54(%rsp)
  movl   $0x303030,0x60(%rsp)
  movl   $0x303030,0x6c(%rsp)
  movl   $0x303030,0x78(%rsp)
  movl   $0x303030,0x84(%rsp)
  mov    %rax,0x41(%rsp)
  mov    $0x3030,%eax
  mov    %ax,0x49(%rsp)
  movabs $0x302e30303231302b,%rax
  mov    %rax,0x4c(%rsp)
  add    $0x7070000,%rax
  mov    %rax,0x58(%rsp)
  sub    $0x8ff0000,%rax
  mov    %rax,0x64(%rsp)
  sub    $0x6ff00,%rax
  mov    %rax,0x70(%rsp)
  add    $0x900ff02,%rax
  mov    %rax,0x7c(%rsp)
  sub    $0x8ff0000,%rax
  mov    %rax,0x88(%rsp)
  sub    $0x1ff00,%rax
  mov    %rax,0x94(%rsp)
  sub    $0x20102,%rax
  mov    %rax,0xa0(%rsp)
  movabs $0x786a786a78797979,%rax
  mov    %rax,0xac(%rsp)
  xor    %eax,%eax
  movl   $0x303030,0x90(%rsp)
  movl   $0x303030,0x9c(%rsp)
  movl   $0x303030,0xa8(%rsp)
  movl   $0x6a6a6a,0xb4(%rsp)
  call   <printf@plt>
  lea    0x4c(%rsp),%rsi
  mov    %rbp,%rdi
  call   <geofence_aprs_frequency@plt>
  lea    D22(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x58(%rsp),%rsi
  mov    %rbp,%rdi
  call   <geofence_aprs_frequency@plt>
  lea    D33(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x64(%rsp),%rsi
  mov    %rbp,%rdi
  call   <geofence_aprs_frequency@plt>
  lea    D9(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x70(%rsp),%rsi
  mov    %rbp,%rdi
  call   <geofence_aprs_frequency@plt>
  lea    D19(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x7c(%rsp),%rsi
  mov    %rbp,%rdi
  call   <geofence_aprs_frequency@plt>
  lea    D81(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x88(%rsp),%rsi
  mov    %rbp,%rdi
  call   <geofence_aprs_frequency@plt>
  lea    D16(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x94(%rsp),%rsi
  mov    %rbp,%rdi
  call   <geofence_aprs_frequency@plt>
  lea    D38(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0xa0(%rsp),%rsi
  mov    %rbp,%rdi
  call   <geofence_aprs_frequency@plt>
  lea    D12(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %rbp,%rdi
  lea    0xac(%rsp),%rsi
  mov    $0x30,%ebp
  call   <geofence_aprs_frequency@plt>
  xor    %esi,%esi
  xor    %edi,%edi
  mov    %bp,0x3f(%rsp)
  lea    0xb(%rsp),%rbp
  xor    %ecx,%ecx
  xor    %r8d,%r8d
  xor    %r9d,%r9d
  xor    %r10d,%r10d
  mov    $0x30,%r11d
  xor    %edx,%edx
  mov    %si,0x1b(%rsp)
  mov    %di,0x21(%rsp)
  mov    $0x1,%esi
  mov    %rbp,%rdi
  mov    %cx,0x15(%rsp)
  mov    %r8w,0x27(%rsp)
  mov    %r9w,0x2d(%rsp)
  mov    %r10w,0x33(%rsp)
  mov    %r11w,0x39(%rsp)
  mov    %dx,0xf(%rsp)
  movl   $0x30,0xb(%rsp)
  movl   $0x3038,0x11(%rsp)
  movl   $0x303038,0x17(%rsp)
  movl   $0x30303033,0x1d(%rsp)
  movl   $0x30303034,0x23(%rsp)
  movl   $0x30303134,0x29(%rsp)
  movl   $0x39393939,0x2f(%rsp)
  movl   $0x30303031,0x35(%rsp)
  movl   $0x30303035,0x3b(%rsp)
  call   <geofence_slow_tlm_altitude@plt>
  mov    %rbp,%rsi
  lea    D98(%rip),%rbp
  mov    %eax,%edx
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdi
  mov    $0x2,%esi
  call   <geofence_slow_tlm_altitude@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    0x17(%rsp),%r12
  mov    %eax,%edx
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdi
  mov    $0x3,%esi
  call   <geofence_slow_tlm_altitude@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    0x1d(%rsp),%r12
  mov    %eax,%edx
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdi
  mov    $0x4,%esi
  call   <geofence_slow_tlm_altitude@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    0x23(%rsp),%r12
  mov    %eax,%edx
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdi
  mov    $0x4,%esi
  call   <geofence_slow_tlm_altitude@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    0x29(%rsp),%r12
  mov    %eax,%edx
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdi
  mov    $0x4,%esi
  call   <geofence_slow_tlm_altitude@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    0x2f(%rsp),%r12
  mov    %eax,%edx
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdi
  mov    $0x4,%esi
  call   <geofence_slow_tlm_altitude@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    0x35(%rsp),%r12
  mov    %eax,%edx
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdi
  mov    $0x5,%esi
  call   <geofence_slow_tlm_altitude@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    0x3b(%rsp),%r12
  mov    %eax,%edx
  xor    %eax,%eax
  call   <printf@plt>
  mov    $0x5,%esi
  mov    %r12,%rdi
  call   <geofence_slow_tlm_altitude@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    %eax,%edx
  xor    %eax,%eax
  call   <printf@plt>
  mov    0xb8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L7
  add    $0xc8,%rsp
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  ret
L7:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D20
type: string
name: disassemble_data
arguments: label: D22
type: string
name: disassemble_data
arguments: label: D33
type: string
name: disassemble_data
arguments: label: D9
type: string
name: disassemble_data
arguments: label: D19
type: string
name: disassemble_data
arguments: label: D81
type: string
name: disassemble_data
arguments: label: D16
type: string
name: disassemble_data
arguments: label: D38
type: string
name: disassemble_data
arguments: label: D12
type: string
name: disassemble_data
arguments: label: D98
type: string

tool: D20: 12E (EU) is 

tool: D22: 89E (EU) is 

tool: D33: 90E (CN) is 

tool: D9: 120E (CN) is 

tool: D19: 39W (EU) is 

tool: D81: 40W (US) is 

tool: D16: 120W (US) is 

tool: D38: 0E (EU) is 

tool: D12: ERROR (EU) is 

tool: D98: %s: %d


assistant: ```c
int main(void) {
  char lat[11] = "+0000.0000";
  char a[12] = "+01200.0000";
  char b[12] = "+08900.0000";
  char c[12] = "+09000.0000";
  char d[12] = "+12000.0000";
  char e[12] = "-03900.0000";
  char f[12] = "-04000.0000";
  char g[12] = "-12000.0000";
  char h[12] = "+00000.0000";
  char i[12] = "yyyxjxjxjjj";
  printf("12E (EU) is ");
  geofence_aprs_frequency(lat, a);
  printf("89E (EU) is ");
  geofence_aprs_frequency(lat, b);
  printf("90E (CN) is ");
  geofence_aprs_frequency(lat, c);
  printf("120E (CN) is ");
  geofence_aprs_frequency(lat, d);
  printf("39W (EU) is ");
  geofence_aprs_frequency(lat, e);
  printf("40W (US) is ");
  geofence_aprs_frequency(lat, f);
  printf("120W (US) is ");
  geofence_aprs_frequency(lat, g);
  printf("0E (EU) is ");
  geofence_aprs_frequency(lat, h);
  printf("ERROR (EU) is ");
  geofence_aprs_frequency(lat, i);
  char aa[6] = "0";
  int aa_len = 1;
  char bb[6] = "80";
  int bb_len = 2;
  char cc[6] = "800";
  int cc_len = 3;
  char dd[6] = "3000";
  int dd_len = 4;
  char ee[6] = "4000";
  int ee_len = 4;
  char ff[6] = "4100";
  int ff_len = 4;
  char gg[6] = "9999";
  int gg_len = 4;
  char hh[6] = "10000";
  int hh_len = 5;
  char ii[6] = "50000";
  int ii_len = 5;
  printf("%s: %d\n", aa, geofence_slow_tlm_altitude(aa, aa_len));
  printf("%s: %d\n", bb, geofence_slow_tlm_altitude(bb, bb_len));
  printf("%s: %d\n", cc, geofence_slow_tlm_altitude(cc, cc_len));
  printf("%s: %d\n", dd, geofence_slow_tlm_altitude(dd, dd_len));
  printf("%s: %d\n", ee, geofence_slow_tlm_altitude(ee, ee_len));
  printf("%s: %d\n", ff, geofence_slow_tlm_altitude(ff, ff_len));
  printf("%s: %d\n", gg, geofence_slow_tlm_altitude(gg, gg_len));
  printf("%s: %d\n", hh, geofence_slow_tlm_altitude(hh, hh_len));
  printf("%s: %d\n", ii, geofence_slow_tlm_altitude(ii, ii_len));
  return 0;
}
```