user: 下面的汇编指令对应的C源代码是什么:

```asm
<tft_line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %edx,-0x2c(%rbp)
  mov    %ecx,-0x30(%rbp)
  mov    %r8d,-0x34(%rbp)
  mov    -0x28(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  je     L15
  mov    -0x2c(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jne    L91
L15:
  mov    -0x34(%rbp),%edi
  mov    -0x30(%rbp),%ecx
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%esi
  mov    -0x24(%rbp),%eax
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <tft_fill@plt>
  jmp    L43
L91:
  mov    -0x34(%rbp),%eax
  sub    -0x2c(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jns    L70
  negl   -0x10(%rbp)
  movl   $0xffffffff,-0x8(%rbp)
  jmp    L49
L70:
  movl   $0x1,-0x8(%rbp)
L49:
  mov    -0x30(%rbp),%eax
  sub    -0x28(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  jns    L108
  negl   -0x14(%rbp)
  movl   $0xffffffff,-0xc(%rbp)
  jmp    L57
L108:
  movl   $0x1,-0xc(%rbp)
L57:
  shll   -0x10(%rbp)
  shll   -0x14(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <tft_pixel@plt>
  mov    -0x14(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jle    L122
  mov    -0x14(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L50
L106:
  cmpl   $0x0,-0x4(%rbp)
  js     L121
  mov    -0x8(%rbp),%eax
  add    %eax,-0x2c(%rbp)
  mov    -0x14(%rbp),%eax
  sub    %eax,-0x4(%rbp)
L121:
  mov    -0xc(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x10(%rbp),%eax
  add    %eax,-0x4(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <tft_pixel@plt>
L50:
  mov    -0x28(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jne    L106
  jmp    L43
L122:
  mov    -0x10(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L117
L32:
  cmpl   $0x0,-0x4(%rbp)
  js     L96
  mov    -0xc(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x10(%rbp),%eax
  sub    %eax,-0x4(%rbp)
L96:
  mov    -0x8(%rbp),%eax
  add    %eax,-0x2c(%rbp)
  mov    -0x14(%rbp),%eax
  add    %eax,-0x4(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <tft_pixel@plt>
L117:
  mov    -0x2c(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jne    L32
L43:
  leave
  ret
```

assistant: ```c
void tft_line(int color, int x0, int y0, int x1, int y1) {
  int dx, dy, stepx, stepy, fraction;
  if (x0 == x1 || y0 == y1) {
    tft_fill(color, x0, y0, x1, y1);
    return;
  }
  dy = y1 - y0;
  if (dy < 0) {
    dy = -dy;
    stepy = -1;
  } else {
    stepy = 1;
  }
  dx = x1 - x0;
  if (dx < 0) {
    dx = -dx;
    stepx = -1;
  } else {
    stepx = 1;
  }
  dy <<= 1;
  dx <<= 1;
  tft_pixel(color, x0, y0);
  if (dx > dy) {
    fraction = dy - (dx >> 1);
    while (x0 != x1) {
      if (fraction >= 0) {
        y0 += stepy;
        fraction -= dx;
      }
      x0 += stepx;
      fraction += dy;
      tft_pixel(color, x0, y0);
    }
  } else {
    fraction = dx - (dy >> 1);
    while (y0 != y1) {
      if (fraction >= 0) {
        x0 += stepx;
        fraction -= dy;
      }
      y0 += stepy;
      fraction += dx;
      tft_pixel(color, x0, y0);
    }
  }
}
```