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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  lea    D22(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x1,-0x28(%rbp)
  jmp    L176
L177:
  mov    -0x28(%rbp),%eax
  mov    %eax,%esi
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  movl   $0x0,-0x18(%rbp)
  movl   $0x0,-0x20(%rbp)
  jmp    L205
L147:
  mov    -0x20(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edi
  mov    -0x24(%rbp),%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  mov    %edx,%ecx
  sub    %eax,%ecx
  lea    (%rdi,%rcx,1),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x24(%rbp)
  addl   $0x1,-0x18(%rbp)
L205:
  cmpl   $0x0,-0x24(%rbp)
  jne    L147
  mov    -0x18(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  jmp    L25
L145:
  cmpl   $0x3,-0x8(%rbp)
  je     L57
  cmpl   $0x3,-0x8(%rbp)
  jg     L42
  cmpl   $0x1,-0x8(%rbp)
  je     L92
  cmpl   $0x2,-0x8(%rbp)
  je     L182
  jmp    L42
L92:
  movl   $0x49,-0x14(%rbp)
  movl   $0x56,-0x10(%rbp)
  movl   $0x58,-0xc(%rbp)
  jmp    L42
L182:
  movl   $0x58,-0x14(%rbp)
  movl   $0x4c,-0x10(%rbp)
  movl   $0x43,-0xc(%rbp)
  jmp    L42
L57:
  movl   $0x43,-0x14(%rbp)
  nop
L42:
  mov    -0x20(%rbp),%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  sub    %eax,%edx
  mov    %edx,-0x1c(%rbp)
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x20(%rbp)
  cmpl   $0x4,-0x1c(%rbp)
  je     L85
  cmpl   $0x9,-0x1c(%rbp)
  jne    L148
L85:
  cmpl   $0x9,-0x1c(%rbp)
  jne    L143
  mov    -0xc(%rbp),%eax
  jmp    L157
L143:
  mov    -0x10(%rbp),%eax
L157:
  mov    -0x14(%rbp),%ecx
  mov    %eax,%edx
  mov    %ecx,%esi
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L129
L148:
  cmpl   $0x4,-0x1c(%rbp)
  jle    L155
  mov    -0x10(%rbp),%eax
  mov    %eax,%edi
  call   <putchar@plt>
  subl   $0x5,-0x1c(%rbp)
L155:
  movl   $0x0,-0x4(%rbp)
  jmp    L206
L99:
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <putchar@plt>
  addl   $0x1,-0x4(%rbp)
L206:
  mov    -0x4(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jne    L99
L129:
  subl   $0x1,-0x8(%rbp)
L25:
  cmpl   $0x0,-0x8(%rbp)
  jg     L145
  mov    $0xa,%edi
  call   <putchar@plt>
  addl   $0x1,-0x28(%rbp)
L176:
  cmpl   $0x64,-0x28(%rbp)
  jle    L177
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D22
data_type: string
name: disassemble_data
arguments: data_label: D25
data_type: string
name: disassemble_data
arguments: data_label: D14
data_type: string

tool: D22: Decimal:	Romano:

tool: D25: %d		

tool: D14: %c%c

assistant: ```c
int main(void) {
  int num, auxiliar, mirror, lastDigit;
  int sistDecimal;
  int var1, var2, var3;
  int i, j;
  printf("Decimal:\tRomano:\n");
  for (num = 1; num <= 100; num++) {
    printf("%d\t\t", num);
    auxiliar = num;
    sistDecimal = 0;
    mirror = 0;
    while (auxiliar != 0) {
      mirror = mirror * 10 + auxiliar % 10;
      auxiliar /= 10;
      sistDecimal++;
    }
    for (i = sistDecimal; i >= 1; i--) {
      switch (i) {
      case 1:
        var1 = 'I';
        var2 = 'V';
        var3 = 'X';
        break;
      case 2:
        var1 = 'X';
        var2 = 'L';
        var3 = 'C';
        break;
      case 3:
        var1 = 'C';
        break;
      }
      lastDigit = mirror % 10;
      mirror /= 10;
      if (lastDigit == 4 || lastDigit == 9)
        printf("%c%c", var1, lastDigit == 9 ? var3 : var2);
      else {
        if (lastDigit >= 5) {
          printf("%c", var2);
          lastDigit -= 5;
        }
        for (j = 0; j != lastDigit; j++)
          printf("%c", var1);
      }
    }
    putchar('\n');
  }
}
```