user: What would the C source look like for the assembly code provided here:

```asm
<write_lba48>:
  endbr64
  push   %r13
  xor    %eax,%eax
  mov    %rcx,%r13
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  mov    %esi,%ebp
  mov    $0x40,%esi
  push   %rbx
  mov    %edi,%ebx
  mov    $0x1f6,%edi
  sub    $0x8,%rsp
  call   <outb@plt>
  mov    %r12d,%eax
  mov    $0x1f2,%edi
  movzbl %ah,%esi
  xor    %eax,%eax
  call   <outb@plt>
  mov    %ebx,%esi
  mov    $0x1f3,%edi
  xor    %eax,%eax
  shr    $0x18,%esi
  call   <outb@plt>
  movzbl %bpl,%esi
  mov    $0x1f4,%edi
  xor    %eax,%eax
  call   <outb@plt>
  mov    %ebp,%eax
  mov    $0x1f5,%edi
  movzbl %ah,%esi
  xor    %eax,%eax
  call   <outb@plt>
  movzbl %r12b,%esi
  mov    $0x1f2,%edi
  xor    %eax,%eax
  call   <outb@plt>
  movzbl %bl,%esi
  mov    $0x1f3,%edi
  xor    %eax,%eax
  call   <outb@plt>
  movzbl %bh,%esi
  mov    $0x1f4,%edi
  xor    %eax,%eax
  call   <outb@plt>
  mov    %ebx,%esi
  mov    $0x1f5,%edi
  xor    %eax,%eax
  shr    $0x10,%esi
  movzbl %sil,%esi
  call   <outb@plt>
  xor    %eax,%eax
  mov    $0x34,%esi
  mov    $0x1f7,%edi
  call   <outb@plt>
  test   %r12w,%r12w
  je     L45
  movzwl %r12w,%r12d
  lea    0x200(%r13),%rbp
  lea    -0x1(%r12),%eax
  shl    $0x9,%rax
  lea    0x400(%r13,%rax,1),%r12
  lea    D11(%rip),%r13
L56:
  mov    $0x3f6,%edi
  xor    %eax,%eax
  lea    -0x200(%rbp),%rbx
  call   <inb@plt>
  mov    $0x3f6,%edi
  xor    %eax,%eax
  call   <inb@plt>
  mov    $0x3f6,%edi
  xor    %eax,%eax
  call   <inb@plt>
  mov    $0x3f6,%edi
  xor    %eax,%eax
  call   <inb@plt>
  jmp    L74
  nopw   0x0(%rax,%rax,1)
L62:
  test   %al,%al
  jns    L73
  test   $0x8,%al
  jne    L73
L74:
  xor    %eax,%eax
  mov    $0x3f6,%edi
  call   <inb@plt>
  test   $0x21,%al
  je     L62
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <print@plt>
L73:
  mov    $0x1f0,%edx
  nopw   0x0(%rax,%rax,1)
L81:
  movzwl (%rbx),%eax
  out    %ax,(%dx)
  add    $0x2,%rbx
  cmp    %rbx,%rbp
  jne    L81
  add    $0x200,%rbp
  cmp    %r12,%rbp
  jne    L56
L45:
  mov    $0x3f6,%edi
  xor    %eax,%eax
  call   <inb@plt>
  mov    $0x3f6,%edi
  xor    %eax,%eax
  call   <inb@plt>
  mov    $0x3f6,%edi
  xor    %eax,%eax
  call   <inb@plt>
  mov    $0x3f6,%edi
  xor    %eax,%eax
  call   <inb@plt>
  jmp    L107
L54:
  test   %al,%al
  jns    L84
  test   $0x8,%al
  jne    L84
L107:
  xor    %eax,%eax
  mov    $0x3f6,%edi
  call   <inb@plt>
  test   $0x21,%al
  je     L54
  lea    D11(%rip),%rdi
  xor    %eax,%eax
  call   <print@plt>
L84:
  add    $0x8,%rsp
  mov    $0xe7,%esi
  mov    $0x1f7,%edi
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  jmp    1090 <outb@plt>
```

tool_calls: name: read_data
arguments: label: D11
type_guessed: string

tool: D11: ata: drive error


assistant: ```c
void write_lba48(unsigned int lba_low, unsigned int lba_high, unsigned short count, unsigned char *buf) {
  unsigned char c;
  int i, j;
  outb(0x1f0 + 6, (1 << 6));
  outb(0x1f0 + 2, (count >> 8) & 0xff);
  outb(0x1f0 + 3, (lba_low >> 24) & 0xff);
  outb(0x1f0 + 4, lba_high & 0xff);
  outb(0x1f0 + 5, (lba_high >> 8) & 0xff);
  outb(0x1f0 + 2, count & 0xff);
  outb(0x1f0 + 3, lba_low & 0xff);
  outb(0x1f0 + 4, (lba_low >> 8) & 0xff);
  outb(0x1f0 + 5, (lba_low >> 16) & 0xff);
  outb(0x1f0 + 7, 0x34);
  for (i = 0; i < count; ++i) {
    (void)inb(0x3f6);
    (void)inb(0x3f6);
    (void)inb(0x3f6);
    (void)inb(0x3f6);
    do {
      c = inb(0x3f6);
      if ((c & (1 << 0)) || (c & (1 << 5)))
        break;
    } while ((c & (1 << 7)) && !(c & (1 << 3)));
    if ((c & (1 << 0)) || (c & (1 << 5)))
      print("ata: drive error\n");
    for (j = 0; j < 256; ++j) {
      asm volatile("outw %%ax, %%dx" ::"a"(((unsigned short *)buf)[j]), "d"(0x1f0 + 0) : "memory");
    }
    buf += 512;
  }
  (void)inb(0x3f6);
  (void)inb(0x3f6);
  (void)inb(0x3f6);
  (void)inb(0x3f6);
  do {
    c = inb(0x3f6);
    if ((c & (1 << 0)) || (c & (1 << 5)))
      break;
  } while ((c & (1 << 7)) && !(c & (1 << 3)));
  if ((c & (1 << 0)) || (c & (1 << 5)))
    print("ata: drive error\n");
  outb(0x1f0 + 7, 0xe7);
}
```