user: Translate the below assembly code into C programming language:

```asm
<ArabicToRoman>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %edi,%r13d
  mov    $0x64,%edi
  call   <malloc@plt>
  mov    %rax,%r12
  lea    D188(%rip),%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  movslq %r13d,%rax
  imul   $0x66666667,%rax,%rbx
  sar    $0x22,%rbx
  mov    %r13d,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%ebx
  lea    (%rbx,%rbx,4),%edx
  add    %edx,%edx
  imul   $0x51eb851f,%rax,%rax
  sar    $0x25,%rax
  sub    %ecx,%eax
  imul   $0x64,%eax,%eax
  mov    %r13d,%ebx
  sub    %edx,%ebx
  sub    %eax,%edx
  movslq %edx,%rbp
  imul   $0x66666667,%rbp,%rbp
  sar    $0x22,%rbp
  sar    $0x1f,%edx
  sub    %edx,%ebp
  imul   $0xfffffff6,%ebp,%edx
  add    %r13d,%edx
  sub    %ebx,%edx
  movslq %edx,%rax
  imul   $0x51eb851f,%rax,%rax
  sar    $0x25,%rax
  sar    $0x1f,%edx
  sub    %edx,%eax
  cmp    $0x2,%eax
  je     L233
  cmp    $0x3,%eax
  je     L235
  cmp    $0x1,%eax
  je     L138
L209:
  cmp    $0x9,%ebp
  ja     L230
  mov    %ebp,%ebp
  lea    D158(%rip),%rdx
  movslq (%rdx,%rbp,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
L138:
  lea    D208(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L209
L233:
  lea    D109(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L209
L235:
  lea    D187(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L209
  lea    D64(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
L230:
  cmp    $0x9,%ebx
  ja     L182
  mov    %ebx,%ebx
  lea    D41(%rip),%rdx
  movslq (%rdx,%rbx,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D203(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L230
  lea    D186(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L230
  lea    D199(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L230
  lea    D106(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L230
  lea    D17(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L230
  lea    D43(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L230
  lea    D82(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L230
  lea    D174(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L230
  lea    D65(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
L182:
  mov    %r12,%rax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  lea    D4(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L182
  lea    D69(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L182
  lea    D85(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L182
  lea    D214(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L182
  lea    D76(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L182
  lea    D142(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L182
  lea    D184(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L182
  lea    D143(%rip),%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  jmp    L182
```

tool_calls: name: disassemble_data
arguments: label: D188
type_guessed: string
name: disassemble_data
arguments: label: D208
type_guessed: string
name: disassemble_data
arguments: label: D109
type_guessed: string
name: disassemble_data
arguments: label: D187
type_guessed: string
name: disassemble_data
arguments: label: D64
type_guessed: string
name: disassemble_data
arguments: label: D203
type_guessed: string
name: disassemble_data
arguments: label: D186
type_guessed: string
name: disassemble_data
arguments: label: D199
type_guessed: string
name: disassemble_data
arguments: label: D106
type_guessed: string
name: disassemble_data
arguments: label: D17
type_guessed: string
name: disassemble_data
arguments: label: D43
type_guessed: string
name: disassemble_data
arguments: label: D82
type_guessed: string
name: disassemble_data
arguments: label: D174
type_guessed: string
name: disassemble_data
arguments: label: D65
type_guessed: string
name: disassemble_data
arguments: label: D4
type_guessed: string
name: disassemble_data
arguments: label: D69
type_guessed: string
name: disassemble_data
arguments: label: D85
type_guessed: string
name: disassemble_data
arguments: label: D214
type_guessed: string
name: disassemble_data
arguments: label: D76
type_guessed: string
name: disassemble_data
arguments: label: D142
type_guessed: string
name: disassemble_data
arguments: label: D184
type_guessed: string
name: disassemble_data
arguments: label: D143
type_guessed: string

tool: 

tool: D208: C

tool: D109: CC

tool: D187: CCC

tool: D64: X

tool: D203: XX

tool: D186: XXX

tool: D199: XL

tool: D106: L

tool: D17: LX

tool: D43: LXX

tool: D82: LXXX

tool: D174: XC

tool: D65: I

tool: D4: II

tool: D69: III

tool: D85: IV

tool: D214: V

tool: D76: VI

tool: D142: VII

tool: D184: VIII

tool: D143: IX

assistant: ```c
char *ArabicToRoman(int arabic) {
  int unidades;
  int decenas;
  int centenas;
  char *roman;
  roman = malloc(sizeof(char) * 100);
  strcpy(roman, "");
  unidades = arabic % 10;
  decenas = ((arabic % 100) - unidades) / 10;
  centenas = (arabic - decenas * 10 - unidades) / 100;
  switch (centenas) {
  case 0:
    break;
  case 1:
    strcat(roman, "C");
    break;
  case 2:
    strcat(roman, "CC");
    break;
  case 3:
    strcat(roman, "CCC");
    break;
  }
  switch (decenas) {
  case 0:
    break;
  case 1:
    strcat(roman, "X");
    break;
  case 2:
    strcat(roman, "XX");
    break;
  case 3:
    strcat(roman, "XXX");
    break;
  case 4:
    strcat(roman, "XL");
    break;
  case 5:
    strcat(roman, "L");
    break;
  case 6:
    strcat(roman, "LX");
    break;
  case 7:
    strcat(roman, "LXX");
    break;
  case 8:
    strcat(roman, "LXXX");
    break;
  case 9:
    strcat(roman, "XC");
    break;
  }
  switch (unidades) {
  case 0:
    break;
  case 1:
    strcat(roman, "I");
    break;
  case 2:
    strcat(roman, "II");
    break;
  case 3:
    strcat(roman, "III");
    break;
  case 4:
    strcat(roman, "IV");
    break;
  case 5:
    strcat(roman, "V");
    break;
  case 6:
    strcat(roman, "VI");
    break;
  case 7:
    strcat(roman, "VII");
    break;
  case 8:
    strcat(roman, "VIII");
    break;
  case 9:
    strcat(roman, "IX");
    break;
  }
  return roman;
}
```