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

```asm
<EEPROM_Write>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %edi,-0x54(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %edx,-0x58(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x48(%rbp)
  cmpl   $0xff,-0x54(%rbp)
  jg     L98
  cmpl   $0x0,-0x58(%rbp)
  je     L98
  cmpl   $0x100,-0x58(%rbp)
  jg     L98
  mov    -0x54(%rbp),%eax
  mov    %eax,-0x44(%rbp)
  jmp    L115
L12:
  movl   $0x0,-0x40(%rbp)
  mov    -0x44(%rbp),%eax
  and    $0x7,%eax
  mov    %eax,-0x3c(%rbp)
  mov    $0x8,%eax
  sub    -0x3c(%rbp),%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x58(%rbp),%edx
  mov    -0x38(%rbp),%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x44(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  lea    -0x30(%rbp),%rax
  add    $0x4,%rax
  mov    -0x34(%rbp),%edx
  mov    -0x60(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x34(%rbp),%eax
  lea    0x1(%rax),%edx
  lea    -0x30(%rbp),%rax
  mov    $0x1,%ecx
  mov    %rax,%rsi
  mov    $0xa0,%edi
  call   <I2C_Xfer@plt>
  mov    %eax,-0x48(%rbp)
  cmpl   $0x0,-0x48(%rbp)
  jne    L116
L146:
  lea    -0x30(%rbp),%rax
  mov    $0x1,%ecx
  mov    $0x1,%edx
  mov    %rax,%rsi
  mov    $0xa0,%edi
  call   <I2C_Xfer@plt>
  mov    %eax,-0x48(%rbp)
  addl   $0x1,-0x40(%rbp)
  cmpl   $0x0,-0x48(%rbp)
  je     L59
  cmpl   $0x18f,-0x40(%rbp)
  jle    L146
L59:
  cmpl   $0x0,-0x48(%rbp)
  je     L2
  lea    D28(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L36
L2:
  mov    -0x34(%rbp),%eax
  sub    %eax,-0x58(%rbp)
  mov    -0x34(%rbp),%eax
  add    %eax,-0x44(%rbp)
  mov    -0x34(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rax,-0x60(%rbp)
  jmp    L115
L116:
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movl   $0xfffffffe,-0x48(%rbp)
  jmp    L36
L115:
  cmpl   $0x0,-0x58(%rbp)
  jne    L12
  jmp    L119
L36:
  jmp    L119
L98:
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movl   $0xfffffffd,-0x48(%rbp)
L119:
  mov    -0x48(%rbp),%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L133
  call   <__stack_chk_fail@plt>
L133:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D28
type_guessed: string
name: extract_symbolic_data
arguments: tag: D25
type_guessed: string
name: extract_symbolic_data
arguments: tag: D9
type_guessed: string

tool: D28: 
Timeout getting ACK from EEPROM during write!

tool: D25: 
Failed to write to EEPROM!

tool: D9: 
Invalid EEPROM addressing

assistant: ```c
int32_t EEPROM_Write(uint32_t startdestpos, uint8_t *src, uint32_t len) {
  int32_t retval = 0;
  if (startdestpos < 256 && len && len <= 256) {
    uint8_t tmpbuf[9];
    uint8_t i = startdestpos;
    while (len) {
      uint32_t loopcnt = 0;
      uint8_t startoffset = i & 0x07;
      uint8_t maxcopysize = 8 - startoffset;
      uint8_t bytestocopy = (len > maxcopysize) ? maxcopysize : len;
      tmpbuf[0] = i;
      memcpy(tmpbuf + 1, src, bytestocopy);
      retval = I2C_Xfer((0x50 << 1), tmpbuf, bytestocopy + 1, 1);
      if (!retval) {
        do {
          retval = I2C_Xfer((0x50 << 1), tmpbuf, 1, 1);
          loopcnt++;
        } while (retval && loopcnt < 400);
        if (retval) {
          printf("\nTimeout getting ACK from EEPROM during write!");
          break;
        }
        len -= bytestocopy;
        i += bytestocopy;
        src += bytestocopy;
      } else {
        printf("\nFailed to write to EEPROM!");
        retval = -2;
        break;
      }
    }
  } else {
    printf("\nInvalid EEPROM addressing");
    retval = -3;
  }
  return retval;
}
```