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

```asm
<htmldecode>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x38(%rbp)
  movl   $0x0,-0x1c(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x18(%rbp)
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L15
L49:
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x25,%al
  je     L22
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x18(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  jmp    L98
L22:
  movl   $0x0,-0x1c(%rbp)
  movl   $0x1,-0x20(%rbp)
  jmp    L45
L4:
  mov    -0x28(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %rax,%rax
  je     L46
  mov    -0x28(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x41(%rax),%ebx
  mov    $0x2,%eax
  sub    -0x20(%rbp),%eax
  mov    %eax,%esi
  mov    $0x10,%edi
  call   <pow@plt>
  movsbl %al,%eax
  imul   %ebx,%eax
  add    %eax,-0x1c(%rbp)
  jmp    L75
L46:
  mov    -0x28(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <islower@plt>
  test   %rax,%rax
  je     L40
  mov    -0x28(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x61(%rax),%ebx
  mov    $0x2,%eax
  sub    -0x20(%rbp),%eax
  mov    %eax,%esi
  mov    $0x10,%edi
  call   <pow@plt>
  movsbl %al,%eax
  imul   %ebx,%eax
  add    %eax,-0x1c(%rbp)
  jmp    L75
L40:
  mov    -0x28(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x30(%rax),%ebx
  mov    $0x2,%eax
  sub    -0x20(%rbp),%eax
  mov    %eax,%esi
  mov    $0x10,%edi
  call   <pow@plt>
  movsbl %al,%eax
  imul   %ebx,%eax
  add    %eax,-0x1c(%rbp)
L75:
  addl   $0x1,-0x20(%rbp)
L45:
  cmpl   $0x2,-0x20(%rbp)
  jle    L4
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    -0x1c(%rbp),%edx
  mov    %dl,(%rax)
  addl   $0x2,-0x28(%rbp)
L98:
  addl   $0x1,-0x28(%rbp)
  addl   $0x1,-0x24(%rbp)
L15:
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    %eax,-0x28(%rbp)
  jl     L49
  mov    -0x18(%rbp),%rax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
char *htmldecode(char *msg) {
  int i, r, j, total = 0;
  char *rtn = (char *)malloc(sizeof(char) * strlen(msg));
  for (i = 0, r = 0; i < strlen(msg); i++, r++) {
    if (msg[i] != '%') {
      rtn[r] = msg[i];
    } else {
      total = 0;
      for (j = 1; j <= 2; j++) {
        if (isupper(msg[i + j])) {
          total += (msg[i + j] - 'A') * pow(16, 2 - j);
        } else if (islower(msg[i + j])) {
          total += (msg[i + j] - 'a') * pow(16, 2 - j);
        } else {
          total += (msg[i + j] - '0') * pow(16, 2 - j);
        }
      }
      rtn[r] = total;
      i += 2;
    }
  }
  return rtn;
}
```