user: 这段汇编代码用C语言表示是什么样的：

```asm
<del_ip>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0xa0,%rsp
  mov    %edi,-0x1084(%rbp)
  mov    %rsi,-0x1090(%rbp)
  mov    %edx,-0x1088(%rbp)
  mov    %rcx,-0x1098(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x1074(%rbp)
  lea    -0x1010(%rbp),%rax
  mov    $0x1000,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  lea    -0x1010(%rbp),%rax
  mov    %rax,-0x1068(%rbp)
  mov    $0x20,%edi
  call   <NLMSG_LENGTH@plt>
  mov    -0x1068(%rbp),%rdx
  mov    %eax,(%rdx)
  mov    D59(%rip),%rax
  mov    (%rax),%edx
  mov    -0x1068(%rbp),%rax
  mov    %edx,0x8(%rax)
  mov    D18(%rip),%rax
  mov    (%rax),%edx
  mov    D0(%rip),%rax
  mov    (%rax),%eax
  or     %eax,%edx
  mov    -0x1068(%rbp),%rax
  mov    %edx,0x4(%rax)
  mov    -0x1068(%rbp),%rax
  mov    %rax,%rdi
  call   <NLMSG_DATA@plt>
  mov    %rax,-0x1060(%rbp)
  mov    -0x1060(%rbp),%rax
  mov    -0x1088(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x1060(%rbp),%rax
  movl   $0x10,0x4(%rax)
  mov    D21(%rip),%rax
  mov    (%rax),%edx
  mov    -0x1060(%rbp),%rax
  mov    %edx,0x18(%rax)
  mov    -0x1060(%rbp),%rax
  movq   $0x0,0x10(%rax)
  mov    -0x1060(%rbp),%rax
  movl   $0x2,0x8(%rax)
  mov    -0x1060(%rbp),%rax
  mov    %rax,%rdi
  call   <IFA_RTA@plt>
  mov    %rax,-0x1058(%rbp)
  mov    D38(%rip),%rax
  mov    (%rax),%edx
  mov    -0x1058(%rbp),%rax
  mov    %edx,0x4(%rax)
  mov    -0x1058(%rbp),%rax
  mov    %rax,%rdi
  call   <RTA_DATA@plt>
  mov    %eax,%ecx
  mov    -0x1098(%rbp),%rdx
  mov    -0x1088(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <pton@plt>
  mov    %eax,-0x1074(%rbp)
  mov    -0x1074(%rbp),%eax
  mov    %eax,%edi
  call   <RTA_LENGTH@plt>
  mov    %eax,%edx
  mov    -0x1058(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x1068(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <NLMSG_ALIGN@plt>
  mov    %eax,%edx
  mov    -0x1058(%rbp),%rax
  mov    (%rax),%eax
  add    %eax,%edx
  mov    -0x1068(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x1068(%rbp),%rax
  mov    (%rax),%edx
  mov    $0x1000,%eax
  sub    %edx,%eax
  mov    %eax,-0x1070(%rbp)
  mov    -0x1070(%rbp),%edx
  mov    -0x1058(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <RTA_NEXT@plt>
  mov    %rax,-0x1058(%rbp)
  mov    D11(%rip),%rax
  mov    (%rax),%edx
  mov    -0x1058(%rbp),%rax
  mov    %edx,0x4(%rax)
  mov    -0x1058(%rbp),%rax
  mov    %rax,%rdi
  call   <RTA_DATA@plt>
  mov    %eax,%ecx
  mov    -0x1098(%rbp),%rdx
  mov    -0x1088(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <pton@plt>
  mov    %eax,-0x1074(%rbp)
  mov    -0x1074(%rbp),%eax
  mov    %eax,%edi
  call   <RTA_LENGTH@plt>
  mov    %eax,%edx
  mov    -0x1058(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x1068(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x1058(%rbp),%rax
  mov    (%rax),%eax
  add    %eax,%edx
  mov    -0x1068(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x1068(%rbp),%rax
  mov    %eax,-0x1050(%rbp)
  mov    -0x1068(%rbp),%rax
  mov    (%rax),%eax
  cltq
  mov    %rax,-0x1048(%rbp)
  mov    -0x1090(%rbp),%rax
  mov    %eax,-0x1040(%rbp)
  movl   $0x4,-0x103c(%rbp)
  lea    -0x1050(%rbp),%rax
  mov    %eax,-0x1038(%rbp)
  movl   $0x1,-0x1034(%rbp)
  movq   $0x0,-0x1030(%rbp)
  movq   $0x0,-0x1028(%rbp)
  movq   $0x0,-0x1020(%rbp)
  lea    -0x1040(%rbp),%rcx
  mov    -0x1084(%rbp),%eax
  mov    $0x0,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <sendmsg@plt>
  mov    %eax,-0x106c(%rbp)
  cmpl   $0x0,-0x106c(%rbp)
  jns    L3
  mov    $0xffffffff,%eax
  jmp    L22
L3:
  mov    $0x0,%eax
L22:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L23
  call   <__stack_chk_fail@plt>
L23:
  leave
  ret
```

assistant: ```c
int del_ip(int fd, struct sockaddr_nl *sa, int domain, const char *ip) {
  char buf[4096];
  int ip_len = 0;
  memset(buf, 0, 4096);
  struct nlmsghdr *nl;
  nl = (struct nlmsghdr *)buf;
  nl->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
  nl->nlmsg_type = RTM_DELADDR;
  nl->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  struct ifaddrmsg *ifa;
  ifa = (struct ifaddrmsg *)NLMSG_DATA(nl);
  ifa->ifa_family = domain;
  ifa->ifa_prefixlen = 16;
  ifa->ifa_flags = IFA_F_PERMANENT;
  ifa->ifa_scope = 0;
  ifa->ifa_index = 2;
  struct rtattr *rta = (struct rtattr *)IFA_RTA(ifa);
  rta->rta_type = IFA_LOCAL;
  ip_len = pton(domain, RTA_DATA(rta), ip);
  rta->rta_len = RTA_LENGTH(ip_len);
  nl->nlmsg_len = NLMSG_ALIGN(nl->nlmsg_len) + rta->rta_len;
  int l = 4096 - nl->nlmsg_len;
  rta = (struct rtattr *)RTA_NEXT(rta, l);
  rta->rta_type = IFA_ADDRESS;
  ip_len = pton(domain, RTA_DATA(rta), ip);
  rta->rta_len = RTA_LENGTH(ip_len);
  nl->nlmsg_len += rta->rta_len;
  struct iovec iov = {nl, nl->nlmsg_len};
  struct msghdr msg = {sa, sizeof(*sa), &iov, 1, NULL, 0, 0};
  int r = sendmsg(fd, &msg, 0);
  return (r < 0) ? -1 : 0;
}
```