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

```asm
<desas2>:
  endbr64
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x158,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x148(%rsp)
  lea    D139(%rip),%rax
  mov    %rax,0x40(%rsp)
  lea    D72(%rip),%rax
  mov    %rax,0x48(%rsp)
  lea    D120(%rip),%rax
  mov    %rax,0x50(%rsp)
  lea    D164(%rip),%rax
  mov    %rax,0x58(%rsp)
  lea    D50(%rip),%rax
  mov    %rax,0x60(%rsp)
  lea    D93(%rip),%rax
  mov    %rax,0x68(%rsp)
  lea    D342(%rip),%rax
  mov    %rax,0x70(%rsp)
  lea    D271(%rip),%rax
  mov    %rax,0x78(%rsp)
  lea    D60(%rip),%rax
  mov    %rax,0x80(%rsp)
  lea    D368(%rip),%rax
  mov    %rax,0x88(%rsp)
  lea    D358(%rip),%rax
  mov    %rax,0x90(%rsp)
  lea    D341(%rip),%rax
  mov    %rax,0x98(%rsp)
  lea    D123(%rip),%rax
  mov    %rax,0xa0(%rsp)
  lea    D293(%rip),%rax
  mov    %rax,0xa8(%rsp)
  lea    D393(%rip),%rax
  mov    %rax,0xb0(%rsp)
  lea    D236(%rip),%rax
  mov    %rax,0xb8(%rsp)
  lea    D58(%rip),%rax
  mov    %rax,0xc0(%rsp)
  lea    D222(%rip),%rax
  mov    %rax,0xc8(%rsp)
  lea    D234(%rip),%rax
  mov    %rax,0xd0(%rsp)
  lea    D292(%rip),%rax
  mov    %rax,0xd8(%rsp)
  lea    D44(%rip),%rax
  mov    %rax,0xe0(%rsp)
  lea    D249(%rip),%rax
  mov    %rax,0xe8(%rsp)
  lea    D136(%rip),%rax
  mov    %rax,0xf0(%rsp)
  lea    D345(%rip),%rax
  mov    %rax,0xf8(%rsp)
  lea    D202(%rip),%rax
  mov    %rax,0x100(%rsp)
  lea    D379(%rip),%rax
  mov    %rax,0x108(%rsp)
  lea    D18(%rip),%rax
  mov    %rax,0x110(%rsp)
  lea    D260(%rip),%rax
  mov    %rax,0x118(%rsp)
  lea    D328(%rip),%rax
  mov    (%rdi),%ebx
  mov    %rbp,%rdi
  mov    %rax,0x120(%rsp)
  lea    D365(%rip),%rax
  mov    %rax,0x128(%rsp)
  lea    D279(%rip),%rax
  mov    %rax,0x130(%rsp)
  lea    D394(%rip),%rax
  mov    %rax,0x138(%rsp)
  lea    D240(%rip),%rax
  mov    %rax,(%rsp)
  lea    D200(%rip),%rax
  mov    %rax,0x8(%rsp)
  lea    D250(%rip),%rax
  mov    %rax,0x10(%rsp)
  lea    D231(%rip),%rax
  mov    %rax,0x18(%rsp)
  lea    D216(%rip),%rax
  mov    %rax,0x20(%rsp)
  lea    D73(%rip),%rax
  mov    %rax,0x28(%rsp)
  lea    D8(%rip),%rax
  mov    %rax,0x30(%rsp)
  lea    D225(%rip),%rax
  mov    %rax,0x38(%rsp)
  mov    %ebx,%eax
  sar    $0x2,%ebx
  sar    $0x5,%eax
  and    $0x7,%ebx
  and    $0x1f,%eax
  mov    0x40(%rsp,%rax,8),%rsi
  call   <strcpy@plt>
  mov    (%rsp,%rbx,8),%rsi
  mov    %rbp,%rdi
  call   <strcat@plt>
  mov    0x148(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  add    $0x158,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  ret
L1:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_tag: D139
datatype: string
name: unpack_data
arguments: data_tag: D72
datatype: string
name: unpack_data
arguments: data_tag: D120
datatype: string
name: unpack_data
arguments: data_tag: D164
datatype: string
name: unpack_data
arguments: data_tag: D50
datatype: string
name: unpack_data
arguments: data_tag: D93
datatype: string
name: unpack_data
arguments: data_tag: D342
datatype: string
name: unpack_data
arguments: data_tag: D271
datatype: string
name: unpack_data
arguments: data_tag: D60
datatype: string
name: unpack_data
arguments: data_tag: D368
datatype: string
name: unpack_data
arguments: data_tag: D358
datatype: string
name: unpack_data
arguments: data_tag: D341
datatype: string
name: unpack_data
arguments: data_tag: D123
datatype: string
name: unpack_data
arguments: data_tag: D293
datatype: string
name: unpack_data
arguments: data_tag: D393
datatype: string
name: unpack_data
arguments: data_tag: D236
datatype: string
name: unpack_data
arguments: data_tag: D58
datatype: string
name: unpack_data
arguments: data_tag: D222
datatype: string
name: unpack_data
arguments: data_tag: D234
datatype: string
name: unpack_data
arguments: data_tag: D292
datatype: string
name: unpack_data
arguments: data_tag: D44
datatype: string
name: unpack_data
arguments: data_tag: D249
datatype: string
name: unpack_data
arguments: data_tag: D136
datatype: string
name: unpack_data
arguments: data_tag: D345
datatype: string
name: unpack_data
arguments: data_tag: D202
datatype: string
name: unpack_data
arguments: data_tag: D379
datatype: string
name: unpack_data
arguments: data_tag: D18
datatype: string
name: unpack_data
arguments: data_tag: D260
datatype: string
name: unpack_data
arguments: data_tag: D328
datatype: string
name: unpack_data
arguments: data_tag: D365
datatype: string
name: unpack_data
arguments: data_tag: D279
datatype: string
name: unpack_data
arguments: data_tag: D394
datatype: string
name: unpack_data
arguments: data_tag: D240
datatype: string
name: unpack_data
arguments: data_tag: D200
datatype: string
name: unpack_data
arguments: data_tag: D250
datatype: string
name: unpack_data
arguments: data_tag: D231
datatype: string
name: unpack_data
arguments: data_tag: D216
datatype: string
name: unpack_data
arguments: data_tag: D73
datatype: string
name: unpack_data
arguments: data_tag: D8
datatype: string
name: unpack_data
arguments: data_tag: D225
datatype: string

tool: D139: A=0   

tool: D72: B=0   

tool: D120: C=0   

tool: D164: ABEX  

tool: D50: B=A   

tool: D93: ACEX  

tool: D342: C=B   

tool: D271: BCEX  

tool: D60: A=C   

tool: D368: A=A+B 

tool: D358: A=A+C 

tool: D341: A=A+1 

tool: D123: A=A-B 

tool: D293: A=A-1 

tool: D393: A=A-C 

tool: D236: C=C+C 

tool: D58: C=A+C 

tool: D222: C=C+1 

tool: D234: C=A-C 

tool: D292: C=C-1 

tool: D44: C=-C  

tool: D249: C=-C-1

tool: D136: ?B#0  

tool: D345: ?C#0  

tool: D202: ?A<C  

tool: D379: ?A<B  

tool: D18: ?A#0  

tool: D260: ?A#C  

tool: D328: ASR   

tool: D365: BSR   

tool: D279: CSR   

tool: D394: ASL   

tool: D240:  PT

tool: D200:  X 

tool: D250:  WPT

tool: D231:  W 

tool: D216:  PQ

tool: D73:  XS

tool: D8:  M 

tool: D225:  S 

assistant: ```c
int desas2(int *codes, char *ligne) {
  int opc, te;
  char *mnemo[] = {"A=0   ", "B=0   ", "C=0   ", "ABEX  ", "B=A   ", "ACEX  ", "C=B   ", "BCEX  ", "A=C   ", "A=A+B ", "A=A+C ", "A=A+1 ", "A=A-B ", "A=A-1 ", "A=A-C ", "C=C+C ", "C=A+C ", "C=C+1 ", "C=A-C ", "C=C-1 ", "C=-C  ", "C=-C-1", "?B#0  ", "?C#0  ", "?A<C  ", "?A<B  ", "?A#0  ", "?A#C  ", "ASR   ", "BSR   ", "CSR   ", "ASL   "};
  char *champ[] = {" PT", " X ", " WPT", " W ", " PQ", " XS", " M ", " S "};
  opc = (codes[0] >> 5) & 0x1f;
  te = (codes[0] >> 2) & 0x07;
  strcpy(ligne, mnemo[opc]);
  strcat(ligne, champ[te]);
  return (1);
}
```