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

```asm
<expand>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  movsbl (%rdi),%edi
  test   %dil,%dil
  je     L151
  mov    %rsi,%r15
  mov    %r13,%r14
  xor    %ebx,%ebx
  xor    %ebp,%ebp
  xor    %r12d,%r12d
  jmp    L152
  nopl   0x0(%rax)
L80:
  add    $0x1,%ebp
  add    $0x1,%ebx
  movslq %ebp,%r12
  lea    0x0(%r13,%r12,1),%r14
  movsbl (%r14),%edi
  test   %dil,%dil
  je     L151
L152:
  movslq %ebx,%rax
  mov    %dil,(%r15,%rax,1)
  cmpb   $0x2d,0x1(%r13,%r12,1)
  jne    L80
  call   <isspace@plt>
  test   %eax,%eax
  jne    L80
  movsbl (%r14),%edi
  call   <isalpha@plt>
  movsbl (%r14),%edi
  test   %rax,%rax
  jne    L110
L48:
  call   <isalpha@plt>
  movsbl (%r14),%edi
  test   %rax,%rax
  jne    L109
L164:
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L12
L147:
  add    $0x1,%ebp
  jmp    L80
  xchg   %ax,%ax
L151:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L109:
  call   <isupper@plt>
  test   %rax,%rax
  jne    L82
  movsbl (%r14),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L147
  jmp    L12
  xchg   %ax,%ax
L110:
  call   <islower@plt>
  test   %rax,%rax
  jne    L166
  movsbl (%r14),%edi
  call   <isalpha@plt>
  movsbl (%r14),%edi
  test   %rax,%rax
  je     L164
  jmp    L109
  nopw   0x0(%rax,%rax,1)
L12:
  lea    0x2(%r13,%r12,1),%r8
  movsbl (%r14),%ecx
  movsbl (%r8),%edx
  mov    %ecx,%eax
  sub    %ecx,%edx
  cmp    $0x1,%edx
  jle    L147
  lea    0x1(%rbx),%edx
  mov    $0x1,%ecx
  movslq %edx,%rdx
  nopl   0x0(%rax)
L225:
  add    %ecx,%eax
  add    $0x1,%ecx
  mov    %edx,%ebx
  mov    %al,(%r15,%rdx,1)
  movsbl (%r14),%edi
  add    $0x1,%rdx
  movsbl (%r8),%esi
  mov    %edi,%eax
  sub    %edi,%esi
  cmp    %ecx,%esi
  jg     L225
  add    $0x1,%ebp
  jmp    L80
L82:
  lea    0x2(%r13,%r12,1),%r8
  movsbl (%r14),%edi
  movsbl (%r8),%edx
  mov    %edi,%eax
  sub    %edi,%edx
  cmp    $0x1,%edx
  jle    L164
  lea    0x1(%rbx),%edx
  mov    $0x1,%ecx
  movslq %edx,%rdx
  nopl   0x0(%rax)
L1:
  add    %ecx,%eax
  add    $0x1,%ecx
  mov    %edx,%ebx
  mov    %al,(%r15,%rdx,1)
  movsbl (%r14),%edi
  add    $0x1,%rdx
  movsbl (%r8),%esi
  mov    %edi,%eax
  sub    %edi,%esi
  cmp    %ecx,%esi
  jg     L1
  jmp    L164
L166:
  lea    0x2(%r13,%r12,1),%r8
  movsbl (%r14),%edi
  movsbl (%r8),%edx
  mov    %edi,%eax
  sub    %edi,%edx
  cmp    $0x1,%edx
  jle    L48
  lea    0x1(%rbx),%edx
  mov    $0x1,%ecx
  movslq %edx,%rdx
  nopl   0x0(%rax)
L67:
  add    %ecx,%eax
  add    $0x1,%ecx
  mov    %edx,%ebx
  mov    %al,(%r15,%rdx,1)
  movsbl (%r14),%edi
  add    $0x1,%rdx
  movsbl (%r8),%esi
  mov    %edi,%eax
  sub    %edi,%esi
  cmp    %ecx,%esi
  jg     L67
  jmp    L48
```

assistant: ```c
void expand(char s1[], char s2[]) {
  int i, j, k;
  for (i = 0, j = 0; s1[i] != '\0'; j++, i++) {
    s2[j] = s1[i];
    if (s1[i + 1] == '-' && !isspace(s1[i])) {
      if (isalpha(s1[i]) && islower(s1[i]))
        for (k = 1; k < s1[i + 2] - s1[i]; k++)
          s2[++j] = s1[i] + k;
      if (isalpha(s1[i]) && isupper(s1[i]))
        for (k = 1; k < s1[i + 2] - s1[i]; k++)
          s2[++j] = s1[i] + k;
      if (isdigit(s1[i]))
        for (k = 1; k < s1[i + 2] - s1[i]; k++)
          s2[++j] = s1[i] + k;
      i++;
    }
  }
}
```