user: 下面的汇编指令对应的C源代码是什么:

```asm
<set_operation_mode>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %edi,%ebp
  mov    %esi,%r12d
  mov    %edx,%ebx
  test   %edx,%edx
  lea    D116(%rip),%r8
  lea    D115(%rip),%rax
  cmovne %rax,%r8
  test   %esi,%esi
  lea    D116(%rip),%rcx
  cmovne %rax,%rcx
  test   %edi,%edi
  lea    D22(%rip),%rdx
  lea    D54(%rip),%rax
  cmovne %rax,%rdx
  lea    D87(%rip),%rsi
  lea    D108(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  cmp    $0x1,%ebx
  ja     L62
  cmp    $0x1,%r12d
  jbe    L46
L69:
  lea    D87(%rip),%rdx
  mov    $0x132,%esi
  lea    D112(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L46:
  mov    %ebx,%esi
  mov    %ebp,%edi
  mov    $0x0,%eax
  call   <wait_for_bridge_setup@plt>
  cmp    %r12d,%ebx
  jne    L38
  test   %ebx,%ebx
  je     L48
L38:
  test   %ebx,%ebx
  je     L112
  cmp    $0x1,%ebx
  jne    L70
  mov    $0x1,%esi
  mov    %ebp,%edi
  mov    $0x0,%eax
  call   <set_opmode_sta@plt>
  mov    $0x0,%eax
  jmp    L76
L62:
  lea    D87(%rip),%rdx
  mov    $0x131,%esi
  lea    D112(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  cmp    $0x1,%r12d
  ja     L69
  mov    %ebx,%esi
  mov    %ebp,%edi
  mov    $0x0,%eax
  call   <wait_for_bridge_setup@plt>
L70:
  lea    D121(%rip),%rdi
  call   <puts@plt>
  mov    $0xffffffff,%eax
  jmp    L76
L48:
  lea    D41(%rip),%rdi
  mov    $0x0,%eax
  call   <nvram_safe_get@plt>
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <atoi@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  jle    L81
L22:
  mov    %ebx,%esi
  mov    %ebp,%edi
  mov    $0x0,%eax
  call   <set_ap_security@plt>
  add    $0x1,%ebx
  cmp    %ebx,%r12d
  jne    L22
  mov    $0x0,%eax
  jmp    L76
L112:
  mov    $0x0,%esi
  mov    %ebp,%edi
  mov    $0x0,%eax
  call   <set_opmode_ap@plt>
  mov    %ebx,%eax
L76:
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L81:
  mov    $0x0,%eax
  jmp    L76
```

tool_calls: name: unpack_data
arguments: data_tag: D116
type: string
name: unpack_data
arguments: data_tag: D115
type: string
name: unpack_data
arguments: data_tag: D22
type: string
name: unpack_data
arguments: data_tag: D54
type: string
name: unpack_data
arguments: data_tag: D87
type: string
name: unpack_data
arguments: data_tag: D108
type: string
name: unpack_data
arguments: data_tag: D112
type: string
name: unpack_data
arguments: data_tag: D121
type: string
name: unpack_data
arguments: data_tag: D41
type: string

tool: D116: WLAN_MODE_AP

tool: D115: WLAN_MODE_STA

tool: D22: RADIO_2G

tool: D54: RADIO_5G

tool: D87: set_operation_mode

tool: D108: %s(%s, %s, %s)


tool: D112: /scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/liutianpingyanxiaoyu/cpe/refs/heads/master/package/liteon-apps/wlan-middleware/src/mid_func.c:%u:%s: Error:Such wlan mode is not supported currently


tool: D121: Error:Such wlan mode is not supported current, please check it

tool: D41: wlv_rule_max

assistant: ```c
int set_operation_mode(int radio, int mode_prev, int mode_curr) {
  int ssid_num = 0;
  int i;
  printf("%s(%s, %s, %s)\r\n", __FUNCTION__, radio == 0 ? "RADIO_2G" : "RADIO_5G", mode_prev == 0 ? "WLAN_MODE_AP" : "WLAN_MODE_STA", mode_curr == 0 ? "WLAN_MODE_AP" : "WLAN_MODE_STA");
  do {
    if (!((0 == mode_curr) || (1 == mode_curr)))
      printf("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/liutianpingyanxiaoyu/cpe/refs/heads/master/package/liteon-apps/wlan-middleware/src/mid_func.c"
             ":%u:%s: "
             "Error:Such wlan mode is not supported currently"
             "\n",
             305, __FUNCTION__);
  } while (0);
  do {
    if (!((0 == mode_prev) || (1 == mode_prev)))
      printf("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/liutianpingyanxiaoyu/cpe/refs/heads/master/package/liteon-apps/wlan-middleware/src/mid_func.c"
             ":%u:%s: "
             "Error:Such wlan mode is not supported currently"
             "\n",
             306, __FUNCTION__);
  } while (0);
  wait_for_bridge_setup(radio, mode_curr);
  if ((mode_prev == mode_curr) && (mode_curr == 0)) {
    ssid_num = atoi(nvram_safe_get("wlv_rule_max"));
    for (i = 0; i < ssid_num; i++) {
      set_ap_security(radio, i);
    }
    return 0;
  }
  switch (mode_curr) {
  case 0:
    set_opmode_ap(radio, mode_curr);
    break;
  case 1:
    set_opmode_sta(radio, mode_curr);
    break;
  default:
    printf("Error:Such wlan mode is not supported current, please check it\n");
    return -1;
  }
  return 0;
}
```