user: 请将以下的汇编代码转换成C语言代码:

```asm
<run_java>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %rsi,-0xa0(%rbp)
  mov    %rdx,-0xa8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x0,%eax
  call   <random_cache_dir@plt>
  mov    %rax,-0x80(%rbp)
  lea    D4(%rip),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  lea    D33(%rip),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  lea    -0x30(%rbp),%rax
  lea    D18(%rip),%rdx
  mov    $0x4,%esi
  mov    %rax,%rdi
  call   <join@plt>
  mov    %rax,-0x78(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <system@plt>
  mov    %eax,-0x84(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  cmpl   $0x0,-0x84(%rbp)
  je     L42
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <clean_cache_dir@plt>
  mov    -0x84(%rbp),%eax
  jmp    L29
L42:
  lea    D5(%rip),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  lea    D77(%rip),%rax
  mov    %rax,-0x40(%rbp)
  lea    -0x50(%rbp),%rax
  lea    D28(%rip),%rdx
  mov    $0x3,%esi
  mov    %rax,%rdi
  call   <join@plt>
  mov    %rax,-0x70(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <system@plt>
  mov    %eax,-0x84(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  cmpl   $0x0,-0x84(%rbp)
  je     L20
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <clean_cache_dir@plt>
  mov    -0x84(%rbp),%eax
  jmp    L29
L20:
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  lea    D72(%rip),%rax
  mov    %rax,-0x58(%rbp)
  lea    -0x60(%rbp),%rax
  lea    D28(%rip),%rdx
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <join@plt>
  mov    %rax,-0x68(%rbp)
  mov    -0xa8(%rbp),%rdx
  mov    -0xa0(%rbp),%rcx
  mov    -0x68(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <run_dex@plt>
  mov    %eax,-0x84(%rbp)
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <clean_cache_dir@plt>
  mov    -0x84(%rbp),%eax
L29:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L13
  call   <__stack_chk_fail@plt>
L13:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D4
type: string
name: extract_symbolic_data
arguments: data_label: D33
type: string
name: extract_symbolic_data
arguments: data_label: D18
type: string
name: extract_symbolic_data
arguments: data_label: D5
type: string
name: extract_symbolic_data
arguments: data_label: D77
type: string
name: extract_symbolic_data
arguments: data_label: D28
type: string
name: extract_symbolic_data
arguments: data_label: D72
type: string

tool: D4: ecj

tool: D33: -d

tool: D18:  

tool: D5: cd 

tool: D77:  && dx --dex --output=run.dex *.class

tool: 

tool: D72: run.dex

assistant: ```c
int run_java(char *java, char *main_class, char *parameters) {
  int status;
  char *cache_dir = random_cache_dir();
  char *ecj_strs[4] = {"ecj", java, "-d", cache_dir};
  char *ecj_cmd = join(ecj_strs, 4, " ");
  status = system(ecj_cmd);
  free(ecj_cmd);
  if (status != 0) {
    clean_cache_dir(cache_dir);
    return status;
  }
  char *dx_strs[3] = {"cd ", cache_dir, " && dx --dex --output=run.dex *.class"};
  char *dx_cmd = join(dx_strs, 3, "");
  status = system(dx_cmd);
  free(dx_cmd);
  if (status != 0) {
    clean_cache_dir(cache_dir);
    return status;
  }
  char *dex_strs[2] = {cache_dir, "run.dex"};
  char *dex_name = join(dex_strs, 2, "");
  status = run_dex(dex_name, main_class, parameters);
  free(dex_name);
  clean_cache_dir(cache_dir);
  return status;
}
```