user: 请从给定的汇编指令推导出C源代码：

```asm
<HaveAlsaRoutines>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  movl   $0x0,-0x4(%rbp)
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_open@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_close@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_malloc@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_free@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_any@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_set_access@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_set_format@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_set_rate_near@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_set_channels@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_set_buffer_size_near@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params_set_period_size_near@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_hw_params@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_sw_params_malloc@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_sw_params_free@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_sw_params_current@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_sw_params_set_start_threshold@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_sw_params_set_avail_min@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_sw_params@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_nonblock@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_state@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_prepare@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_start@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_resume@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_avail_update@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_writei@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_pcm_drop@plt>
  test   %rax,%rax
  je     L62
  mov    $0x0,%eax
  call   <HaveMy_snd_strerror@plt>
  test   %rax,%rax
  je     L62
  movl   $0x1,-0x4(%rbp)
L62:
  mov    -0x4(%rbp),%eax
  leave
  ret
```

assistant: ```c
int HaveAlsaRoutines(void) {
  int IsOk = 0;
  if (HaveMy_snd_pcm_open())
    if (HaveMy_snd_pcm_close())
      if (HaveMy_snd_pcm_hw_params_malloc())
        if (HaveMy_snd_pcm_hw_params_free())
          if (HaveMy_snd_pcm_hw_params_any())
            if (HaveMy_snd_pcm_hw_params_set_access())
              if (HaveMy_snd_pcm_hw_params_set_format())
                if (HaveMy_snd_pcm_hw_params_set_rate_near())
                  if (HaveMy_snd_pcm_hw_params_set_channels())
                    if (HaveMy_snd_pcm_hw_params_set_buffer_size_near())
                      if (HaveMy_snd_pcm_hw_params_set_period_size_near())
                        if (HaveMy_snd_pcm_hw_params())
                          if (HaveMy_snd_pcm_sw_params_malloc())
                            if (HaveMy_snd_pcm_sw_params_free())
                              if (HaveMy_snd_pcm_sw_params_current())
                                if (HaveMy_snd_pcm_sw_params_set_start_threshold())
                                  if (HaveMy_snd_pcm_sw_params_set_avail_min())
                                    if (HaveMy_snd_pcm_sw_params())
                                      if (HaveMy_snd_pcm_nonblock())
                                        if (HaveMy_snd_pcm_state())
                                          if (HaveMy_snd_pcm_prepare())
                                            if (HaveMy_snd_pcm_start())
                                              if (HaveMy_snd_pcm_resume())
                                                if (HaveMy_snd_pcm_avail_update())
                                                  if (HaveMy_snd_pcm_writei())
                                                    if (HaveMy_snd_pcm_drop())
                                                      if (HaveMy_snd_strerror()) {
                                                        IsOk = 1;
                                                      }
  return IsOk;
}
```