user: 请从给定的汇编指令推导出C源代码：

```asm
<usage>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x4(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    %rdx,-0x18(%rbp)
  lea    D221(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D376(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D206(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D160(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D205(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D299(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D194(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D105(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D40(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D181(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D145(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D285(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D178(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D37(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D202(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D297(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D42(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D223(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D327(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D244(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D182(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D179(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D164(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D289(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D362(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D340(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D365(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D256(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D300(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D54(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D305(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D158(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D283(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D125(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D239(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  cmpq   $0x0,-0x10(%rbp)
  je     L14
  cmpq   $0x0,-0x18(%rbp)
  je     L14
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rax,%rsi
  lea    D236(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L14:
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <exit@plt>
  nop
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D221
datatype: string
name: extract_symbolic_data
arguments: data_tag: D376
datatype: string
name: extract_symbolic_data
arguments: data_tag: D206
datatype: string
name: extract_symbolic_data
arguments: data_tag: D160
datatype: string
name: extract_symbolic_data
arguments: data_tag: D205
datatype: string
name: extract_symbolic_data
arguments: data_tag: D299
datatype: string
name: extract_symbolic_data
arguments: data_tag: D194
datatype: string
name: extract_symbolic_data
arguments: data_tag: D105
datatype: string
name: extract_symbolic_data
arguments: data_tag: D40
datatype: string
name: extract_symbolic_data
arguments: data_tag: D181
datatype: string
name: extract_symbolic_data
arguments: data_tag: D145
datatype: string
name: extract_symbolic_data
arguments: data_tag: D285
datatype: string
name: extract_symbolic_data
arguments: data_tag: D178
datatype: string
name: extract_symbolic_data
arguments: data_tag: D37
datatype: string
name: extract_symbolic_data
arguments: data_tag: D202
datatype: string
name: extract_symbolic_data
arguments: data_tag: D297
datatype: string
name: extract_symbolic_data
arguments: data_tag: D42
datatype: string
name: extract_symbolic_data
arguments: data_tag: D223
datatype: string
name: extract_symbolic_data
arguments: data_tag: D327
datatype: string
name: extract_symbolic_data
arguments: data_tag: D13
datatype: string
name: extract_symbolic_data
arguments: data_tag: D244
datatype: string
name: extract_symbolic_data
arguments: data_tag: D182
datatype: string
name: extract_symbolic_data
arguments: data_tag: D179
datatype: string
name: extract_symbolic_data
arguments: data_tag: D164
datatype: string
name: extract_symbolic_data
arguments: data_tag: D289
datatype: string
name: extract_symbolic_data
arguments: data_tag: D362
datatype: string
name: extract_symbolic_data
arguments: data_tag: D340
datatype: string
name: extract_symbolic_data
arguments: data_tag: D365
datatype: string
name: extract_symbolic_data
arguments: data_tag: D256
datatype: string
name: extract_symbolic_data
arguments: data_tag: D300
datatype: string
name: extract_symbolic_data
arguments: data_tag: D54
datatype: string
name: extract_symbolic_data
arguments: data_tag: D305
datatype: string
name: extract_symbolic_data
arguments: data_tag: D158
datatype: string
name: extract_symbolic_data
arguments: data_tag: D283
datatype: string
name: extract_symbolic_data
arguments: data_tag: D7
datatype: string
name: extract_symbolic_data
arguments: data_tag: D125
datatype: string
name: extract_symbolic_data
arguments: data_tag: D239
datatype: string
name: extract_symbolic_data
arguments: data_tag: D236
datatype: string

tool: D221: 
Usage: cdisk [options] output


tool: D376: Options:


tool: D206: 	--partN=startsect,sectors,image.img{,type}

tool: D160: 		Where N is a primary partition number (1, 2, 3, 4).

tool: D205: 		startsect is where this partition starts on disk

tool: D299: 		and sectors is the amount of sectors in the

tool: D194: 		partition. image.img is the image for the partition.

tool: D105: 		If the image is not large enough to fill the

tool: D40: 		partition, the rest of the partition is zeroed.

tool: D181: 		/dev/zero can be used as input to zero the entire

tool: D145: 		partition. A type can also be passed, which must

tool: D285: 		be one of the following: EXT2, EXT3, EXT4, FAT,

tool: D178: 		FAT32, NTFS or SWAP.


tool: D37: 	-n sectors

tool: D202: 		This option allows you to specify the amount of

tool: D297: 		sectors the disk has.


tool: D42: 	-s disksize

tool: D223: 		This option allows you to specify the size of the

tool: D327: 		disk in bytes. M and G can also suffix the number

tool: D13: 		to specify either megabytes (1024 bytes) or gigabytes

tool: D244: 		(1024 megabytes).


tool: D182: 	-l sectsize

tool: D179: 		This options allows you to specify the size of a

tool: D164: 		single disk sector. This option is REQUIRED This

tool: D289: 		number must be one of: 512, 1024, 2048 or 4096


tool: D362: 	-b boot.img

tool: D340: 		This option can be used to supply primary boot

tool: D365: 		code. The code must be less than 446 bytes.


tool: D256: 	--stage-2=boot-stage2.elf,start-sector,sector-count

tool: D300: 		This option can be used to supply second stage

tool: D54: 		boot code. The second stage will be placed at the

tool: D305: 		start sector with the given amount of sectors. This

tool: D158: 		does NOT us up an entry in the partition table.


tool: D283: 	-h or --help

tool: D7: 		Show this help menu.


tool: D125: 	--version

tool: D239: 		Show version information


tool: D236: %s: %s



assistant: ```c
void usage(int ret, const char *err, const char *argument) {
  printf("\nUsage: cdisk [options] output\n\n");
  printf("Options:\n\n");
  printf("\t--partN=startsect,sectors,image.img{,type}\n");
  printf("\t\tWhere N is a primary partition number (1, 2, 3, 4).\n");
  printf("\t\tstartsect is where this partition starts on disk\n");
  printf("\t\tand sectors is the amount of sectors in the\n");
  printf("\t\tpartition. image.img is the image for the partition.\n");
  printf("\t\tIf the image is not large enough to fill the\n");
  printf("\t\tpartition, the rest of the partition is zeroed.\n");
  printf("\t\t/dev/zero can be used as input to zero the entire\n");
  printf("\t\tpartition. A type can also be passed, which must\n");
  printf("\t\tbe one of the following: EXT2, EXT3, EXT4, FAT,\n");
  printf("\t\tFAT32, NTFS or SWAP.\n\n");
  printf("\t-n sectors\n");
  printf("\t\tThis option allows you to specify the amount of\n");
  printf("\t\tsectors the disk has.\n\n");
  printf("\t-s disksize\n");
  printf("\t\tThis option allows you to specify the size of the\n");
  printf("\t\tdisk in bytes. M and G can also suffix the number\n");
  printf("\t\tto specify either megabytes (1024 bytes) or gigabytes\n");
  printf("\t\t(1024 megabytes).\n\n");
  printf("\t-l sectsize\n");
  printf("\t\tThis options allows you to specify the size of a\n");
  printf("\t\tsingle disk sector. This option is REQUIRED This\n");
  printf("\t\tnumber must be one of: 512, 1024, 2048 or 4096\n\n");
  printf("\t-b boot.img\n");
  printf("\t\tThis option can be used to supply primary boot\n");
  printf("\t\tcode. The code must be less than 446 bytes.\n\n");
  printf("\t--stage-2=boot-stage2.elf,start-sector,sector-count\n");
  printf("\t\tThis option can be used to supply second stage\n");
  printf("\t\tboot code. The second stage will be placed at the\n");
  printf("\t\tstart sector with the given amount of sectors. This\n");
  printf("\t\tdoes NOT us up an entry in the partition table.\n\n");
  printf("\t-h or --help\n");
  printf("\t\tShow this help menu.\n\n");
  printf("\t--version\n");
  printf("\t\tShow version information\n\n");
  if (err && argument)
    printf("%s: %s\n\n", err, argument);
  exit(ret);
}
```