user: Please show me the C implementation that matches the assembly code listed below:

```asm
<strtest>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %edi,-0xa4(%rbp)
  mov    %rsi,-0xb0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x0,%eax
  call   <sw_uartdbg_nofifo_init@plt>
  lea    D72(%rip),%rax
  mov    %rax,%rdi
  call   <sw_puts@plt>
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  call   <sw_puts@plt>
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  call   <sw_puts@plt>
  lea    D42(%rip),%rax
  mov    %rax,%rsi
  lea    D21(%rip),%rax
  mov    %rax,%rdi
  call   <sw_strcmp@plt>
  mov    %eax,-0x94(%rbp)
  mov    -0x94(%rbp),%eax
  or     $0x30,%eax
  mov    %eax,%edi
  call   <sw_putchar@plt>
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  call   <sw_puts@plt>
  lea    D49(%rip),%rax
  mov    %rax,%rdi
  call   <sw_puts@plt>
  lea    D34(%rip),%rax
  mov    %rax,%rsi
  lea    D42(%rip),%rax
  mov    %rax,%rdi
  call   <sw_strcmp@plt>
  mov    %eax,-0x94(%rbp)
  mov    -0x94(%rbp),%eax
  or     $0x30,%eax
  mov    %eax,%edi
  call   <sw_putchar@plt>
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  call   <sw_puts@plt>
  lea    D75(%rip),%rax
  mov    %rax,%rdi
  call   <sw_puts@plt>
  lea    D42(%rip),%rax
  mov    %rax,%rsi
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  call   <sw_strcmp@plt>
  mov    %eax,-0x94(%rbp)
  mov    -0x94(%rbp),%eax
  or     $0x30,%eax
  mov    %eax,%edi
  call   <sw_putchar@plt>
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  call   <sw_puts@plt>
L5:
  lea    -0x90(%rbp),%rax
  mov    $0x80,%esi
  mov    %rax,%rdi
  call   <sw_getn@plt>
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sw_printf@plt>
  lea    -0x90(%rbp),%rax
  mov    $0x10,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <sw_strtoul@plt>
  mov    %eax,-0x94(%rbp)
  mov    -0x94(%rbp),%edx
  lea    -0x90(%rbp),%rax
  mov    %rax,%rsi
  lea    D3(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sw_printf@plt>
  jmp    L5
```

tool_calls: name: read_data
arguments: data_tag: D72
datatype: string
name: read_data
arguments: data_tag: D149
datatype: string
name: read_data
arguments: data_tag: D66
datatype: string
name: read_data
arguments: data_tag: D42
datatype: string
name: read_data
arguments: data_tag: D21
datatype: string
name: read_data
arguments: data_tag: D49
datatype: string
name: read_data
arguments: data_tag: D34
datatype: string
name: read_data
arguments: data_tag: D75
datatype: string
name: read_data
arguments: data_tag: D3
datatype: string

tool: D72: ----------------------

tool: D149: 


tool: D66: fand compare fan: 

tool: D42: fan

tool: D21: fand

tool: D49: fan compare li: 

tool: D34: li

tool: D75: li compare fan: 

tool: D3: [%s] = %u


assistant: ```c
int strtest(int argc, char *argv[]) {
  int ret;
  char buf[128];
  sw_uartdbg_nofifo_init();
  sw_puts("----------------------");
  sw_puts("\n\r");
  sw_puts("fand compare fan: ");
  ret = sw_strcmp("fand", "fan");
  sw_putchar(ret | 0x30);
  sw_puts("\n\r");
  sw_puts("fan compare li: ");
  ret = sw_strcmp("fan", "li");
  sw_putchar(ret | 0x30);
  sw_puts("\n\r");
  sw_puts("li compare fan: ");
  ret = sw_strcmp("li", "fan");
  sw_putchar(ret | 0x30);
  sw_puts("\n\r");
  for (;;) {
    sw_getn(buf, 128);
    sw_printf("\n\r");
    ret = sw_strtoul(buf, ((void *)0), 16);
    sw_printf("[%s] = %u\n\r", buf, ret);
  }
  return 0;
}
```