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

```asm
<request_mac>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %edi,-0x64(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,-0x68(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0xffffffff,-0xe(%rbp)
  movw   $0xffff,-0xa(%rbp)
  mov    -0x70(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <set_ifr_name@plt>
  movq   $0x0,-0x40(%rbp)
  movq   $0x0,-0x38(%rbp)
  movq   $0x0,-0x30(%rbp)
  movq   $0x0,-0x28(%rbp)
  movq   $0x0,-0x20(%rbp)
  mov    D39(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,-0x24(%rbp)
  lea    -0x50(%rbp),%rdx
  mov    -0x64(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <get_ifr_ifindex@plt>
  mov    %eax,-0x28(%rbp)
  mov    D55(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,-0x40(%rbp)
  mov    D4(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <htons@plt>
  mov    %rax,-0x30(%rbp)
  mov    D55(%rip),%rax
  mov    (%rax),%edx
  mov    -0x38(%rbp),%rax
  lea    -0xe(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    D58(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <htons@plt>
  mov    -0x78(%rbp),%rdx
  mov    %rax,0x38(%rdx)
  mov    D44(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <htons@plt>
  mov    -0x78(%rbp),%rdx
  mov    %rax,0x30(%rdx)
  mov    D55(%rip),%rax
  mov    (%rax),%edx
  mov    -0x78(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x78(%rbp),%rax
  movl   $0x4,0x4(%rax)
  mov    D94(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <htons@plt>
  mov    -0x78(%rbp),%rdx
  mov    %rax,0x28(%rdx)
  mov    -0x78(%rbp),%rax
  add    $0x20,%rax
  mov    $0x4,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x78(%rbp),%rax
  lea    0x8(%rax),%rcx
  lea    -0x68(%rbp),%rax
  mov    $0x8,%edx
  mov    %rax,%rsi
  mov    %rcx,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  lea    -0x50(%rbp),%rdx
  mov    -0x64(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <get_ifr_hwaddr@plt>
  mov    -0x48(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  lea    -0x50(%rbp),%rdx
  mov    -0x64(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <get_ifr_addr@plt>
  mov    -0x50(%rbp),%rax
  add    $0x2,%rax
  mov    %rax,%rcx
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  lea    -0x40(%rbp),%rdx
  mov    -0x78(%rbp),%rsi
  mov    -0x64(%rbp),%eax
  mov    $0x28,%r9d
  mov    %rdx,%r8
  mov    $0x0,%ecx
  mov    $0x40,%edx
  mov    %eax,%edi
  call   <sendto@plt>
  cmp    $0xffffffff,%eax
  jne    L47
  mov    D1(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <strerror@plt>
  mov    %eax,%edi
  call   <die@plt>
L47:
  mov    -0x78(%rbp),%rsi
  mov    -0x64(%rbp),%eax
  mov    $0x0,%ecx
  mov    $0x40,%edx
  mov    %eax,%edi
  call   <recv@plt>
  mov    %eax,-0x58(%rbp)
  cmpl   $0xffffffff,-0x58(%rbp)
  jne    L0
  mov    D1(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <strerror@plt>
  mov    %eax,%edi
  call   <die@plt>
L0:
  cmpl   $0x0,-0x58(%rbp)
  je     L42
  mov    -0x78(%rbp),%rax
  mov    0x18(%rax),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x78(%rbp),%rax
  mov    0x18(%rax),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x78(%rbp),%rax
  mov    0x18(%rax),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x78(%rbp),%rax
  mov    0x18(%rax),%rax
  mov    (%rax),%eax
  or     %edx,%eax
  mov    %eax,-0x54(%rbp)
  mov    -0x68(%rbp),%eax
  cmp    %eax,-0x54(%rbp)
  je     L3
  jmp    L4
L42:
  nop
L4:
  jmp    L47
L3:
  nop
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L11
  call   <__stack_chk_fail@plt>
L11:
  leave
  ret
```

assistant: ```c
void request_mac(int fd, const char *if_name, struct ether_arp *req, uint32_t ip_addr) {
  const unsigned char ether_broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  struct ifreq ifr;
  set_ifr_name(&ifr, if_name);
  struct sockaddr_ll addr = {0};
  addr.sll_family = AF_PACKET;
  addr.sll_ifindex = get_ifr_ifindex(fd, &ifr);
  addr.sll_halen = ETHER_ADDR_LEN;
  addr.sll_protocol = htons(ETH_P_ARP);
  memcpy(addr.sll_addr, ether_broadcast_addr, ETHER_ADDR_LEN);
  req->arp_hrd = htons(ARPHRD_ETHER);
  req->arp_pro = htons(ETH_P_IP);
  req->arp_hln = ETHER_ADDR_LEN;
  req->arp_pln = sizeof(in_addr_t);
  req->arp_op = htons(ARPOP_REQUEST);
  memset(&req->arp_tha, 0, sizeof(req->arp_tha));
  memcpy(&req->arp_tpa, &ip_addr, sizeof(req->arp_tpa));
  get_ifr_hwaddr(fd, &ifr);
  memcpy(&req->arp_sha, (unsigned char *)ifr.ifr_hwaddr.sa_data, sizeof(req->arp_sha));
  get_ifr_addr(fd, &ifr);
  memcpy(&req->arp_spa, (unsigned char *)ifr.ifr_addr.sa_data + 2, sizeof(req->arp_spa));
  if (sendto(fd, req, sizeof(struct ether_arp), 0, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
    die(strerror(errno));
  }
  while (1) {
    int len = recv(fd, req, sizeof(struct ether_arp), 0);
    if (len == -1) {
      die(strerror(errno));
    }
    if (len == 0) {
      continue;
    }
    unsigned int from_addr = (req->arp_spa[3] << 24) | (req->arp_spa[2] << 16) | (req->arp_spa[1] << 8) | (req->arp_spa[0] << 0);
    if (from_addr != ip_addr) {
      continue;
    }
    break;
  }
}
```