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

```asm
<html_openbody>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %r8,-0x38(%rbp)
  lea    D89(%rip),%rax
  mov    %rax,%rsi
  lea    D86(%rip),%rax
  mov    %rax,%rdi
  call   <html_string@plt>
  mov    %eax,-0x4(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  je     L16
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  test   %rax,%rax
  jle    L16
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D45(%rip),%rax
  mov    %rax,%rdi
  call   <html_string@plt>
  add    %eax,-0x4(%rbp)
L16:
  cmpq   $0x0,-0x20(%rbp)
  je     L34
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  test   %rax,%rax
  jle    L34
  mov    -0x20(%rbp),%rax
  mov    %rax,%rsi
  lea    D77(%rip),%rax
  mov    %rax,%rdi
  call   <html_string@plt>
  add    %eax,-0x4(%rbp)
L34:
  cmpq   $0x0,-0x28(%rbp)
  je     L98
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L98
  mov    -0x28(%rbp),%rax
  mov    %rax,%rsi
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  call   <html_string@plt>
  add    %eax,-0x4(%rbp)
L98:
  cmpq   $0x0,-0x30(%rbp)
  je     L64
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L64
  mov    -0x30(%rbp),%rax
  mov    %rax,%rsi
  lea    D38(%rip),%rax
  mov    %rax,%rdi
  call   <html_string@plt>
  add    %eax,-0x4(%rbp)
L64:
  cmpq   $0x0,-0x38(%rbp)
  je     L38
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L38
  mov    -0x38(%rbp),%rax
  mov    %rax,%rsi
  lea    D29(%rip),%rax
  mov    %rax,%rdi
  call   <html_string@plt>
  add    %eax,-0x4(%rbp)
L38:
  lea    D27(%rip),%rax
  mov    %rax,%rsi
  lea    D64(%rip),%rax
  mov    %rax,%rdi
  call   <html_string@plt>
  add    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  leave
  ret
```

tool_calls: name: read_data
arguments: tag: D89
datatype: string
name: read_data
arguments: tag: D86
datatype: string
name: read_data
arguments: tag: D45
datatype: string
name: read_data
arguments: tag: D77
datatype: string
name: read_data
arguments: tag: D14
datatype: string
name: read_data
arguments: tag: D38
datatype: string
name: read_data
arguments: tag: D29
datatype: string
name: read_data
arguments: tag: D27
datatype: string
name: read_data
arguments: tag: D64
datatype: string

tool: D89: <BODY

tool: D86: %s

tool: D45:  BACKGROUND="%s"

tool: D77:  BGCOLOR="%s"

tool: D14:  TEXT="%s"

tool: D38:  LINK="%s"

tool: D29:  VLINK="%s"

tool: D27: >

tool: D64: %s


assistant: ```c
int html_openbody(char *background, char *bgcolor, char *text, char *link, char *vlink) {
  int l = html_string("%s", "<BODY");
  if ((background) && (strlen(background) > 0))
    l += html_string(" BACKGROUND=\"%s\"", background);
  if ((bgcolor) && (strlen(bgcolor) > 0))
    l += html_string(" BGCOLOR=\"%s\"", bgcolor);
  if ((text) && (strlen(text)))
    l += html_string(" TEXT=\"%s\"", text);
  if ((link) && (strlen(link)))
    l += html_string(" LINK=\"%s\"", link);
  if ((vlink) && (strlen(vlink)))
    l += html_string(" VLINK=\"%s\"", vlink);
  l += html_string("%s\n", ">");
  return (l);
}
```