user: 提供的汇编代码用C语言表示会是什么样子:

```asm
<get_addr_regmask>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  movl   $0x0,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  and    $0x100000,%eax
  test   %rax,%rax
  je     L7
  mov    -0x1c(%rbp),%eax
  movzbl %al,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  and    $0xc0,%eax
  cmp    $0xc0,%eax
  je     L7
  mov    -0x20(%rbp),%eax
  and    $0x200,%eax
  test   %eax,%eax
  je     L154
  mov    -0x8(%rbp),%eax
  and    $0x7,%eax
  cmp    $0x4,%eax
  jne    L16
  mov    -0x1c(%rbp),%eax
  sar    $0x8,%eax
  and    $0xff,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x8(%rbp),%eax
  and    $0xc0,%eax
  cmp    $0xc0,%eax
  je     L7
  mov    -0x4(%rbp),%eax
  and    $0x7,%eax
  cmp    $0x5,%eax
  je     L7
  mov    -0x4(%rbp),%eax
  and    $0x7,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x4(%rbp),%eax
  and    $0x38,%eax
  cmp    $0x20,%eax
  je     L7
  mov    -0x4(%rbp),%eax
  sar    $0x3,%eax
  and    $0x7,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %eax,-0xc(%rbp)
  jmp    L7
L16:
  mov    -0x8(%rbp),%eax
  and    $0xc7,%eax
  cmp    $0x5,%eax
  je     L7
  mov    -0x8(%rbp),%eax
  and    $0x7,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L7
L154:
  mov    -0x8(%rbp),%eax
  and    $0xc7,%eax
  cmp    $0x6,%eax
  je     L7
  mov    -0x8(%rbp),%eax
  and    $0x7,%eax
  cmp    $0x7,%eax
  ja     L7
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D12(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D12(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  movl   $0x7,-0xc(%rbp)
  jmp    L7
  movl   $0x7,-0xc(%rbp)
  jmp    L7
  movl   $0x7,-0xc(%rbp)
  jmp    L7
  movl   $0x7,-0xc(%rbp)
  jmp    L7
  movl   $0x6,-0xc(%rbp)
  jmp    L7
  movl   $0x7,-0xc(%rbp)
  jmp    L7
  movl   $0x5,-0xc(%rbp)
  jmp    L7
  movl   $0x3,-0xc(%rbp)
  nop
L7:
  mov    -0x18(%rbp),%rax
  and    $0x200000,%eax
  test   %rax,%rax
  je     L191
  orl    $0x100,-0xc(%rbp)
L191:
  mov    -0xc(%rbp),%eax
  pop    %rbp
  ret
```

assistant: ```c
uint32_t get_addr_regmask(uint64_t data, uint32_t fetchdat, int op_32) {
  uint32_t addr_regmask = 0;
  if (data & (1ull << 20)) {
    uint8_t modrm = fetchdat & 0xff;
    if ((modrm & 0xc0) != 0xc0) {
      if (op_32 & 0x200) {
        if ((modrm & 0x7) == 4) {
          uint8_t sib = (fetchdat >> 8) & 0xff;
          if ((modrm & 0xc0) != 0xc0 && (sib & 7) != 5) {
            addr_regmask = 1 << (sib & 7);
            if ((sib & 0x38) != 0x20)
              addr_regmask |= 1 << ((sib >> 3) & 7);
          }
        } else if ((modrm & 0xc7) != 5) {
          addr_regmask = 1 << (modrm & 7);
        }
      } else {
        if ((modrm & 0xc7) != 0x06) {
          switch (modrm & 7) {
          case 0:
            addr_regmask = 3 | 6;
            break;
          case 1:
            addr_regmask = 3 | 7;
            break;
          case 2:
            addr_regmask = 5 | 6;
            break;
          case 3:
            addr_regmask = 5 | 7;
            break;
          case 4:
            addr_regmask = 6;
            break;
          case 5:
            addr_regmask = 7;
            break;
          case 6:
            addr_regmask = 5;
            break;
          case 7:
            addr_regmask = 3;
            break;
          }
        }
      }
    }
  }
  if (data & (1ull << 21))
    addr_regmask |= (1 << 8);
  return addr_regmask;
}
```