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

```asm
<get_action_field>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %rdi,%rbp
  sub    $0x70,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  test   %rdi,%rdi
  je     L2
L125:
  lea    -0x1(%rdx),%esi
  mov    %r12,%rcx
  test   %edx,%edx
  jne    L98
  jmp    L139
  nopl   0x0(%rax)
L20:
  cmp    $0x26,%al
  je     L140
  add    $0x1,%rcx
L98:
  movzbl (%rcx),%eax
  test   %al,%al
  je     L128
  cmp    $0x2e,%al
  je     L77
  cmp    $0x3d,%al
  jne    L20
L140:
  sub    $0x1,%esi
  jae    L98
L139:
  movzbl (%rcx),%eax
  cmp    $0x3d,%al
  jbe    L149
  lea    0x20(%rsp),%r13
  mov    %r13,%rdx
L37:
  movabs $0xdfffbfbffffffffe,%rsi
  nopl   0x0(%rax)
L263:
  add    $0x1,%rcx
  mov    %al,(%rdx)
  add    $0x1,%rdx
  movzbl (%rcx),%eax
  cmp    $0x3d,%al
  ja     L263
  bt     %rax,%rsi
  jb     L263
L65:
  movb   $0x0,(%rdx)
  movzbl 0x20(%rsp),%eax
  movl   $0xffffffff,0x18(%rsp)
  cmp    $0x30,%al
  je     L292
L56:
  movsbl %al,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L80
  lea    0x1c(%rsp),%rdx
  lea    D12(%rip),%rsi
  mov    %r13,%rdi
  call   <sscanf@plt>
  test   %eax,%eax
  je     L53
  mov    0x1c(%rsp),%esi
  mov    %rbp,%rdi
  call   <ssds_get_field_id@plt>
  jmp    L294
  xchg   %ax,%ax
L128:
  cmp    $0x2e,%al
  jne    L140
L77:
  add    $0x1,%rcx
  sub    $0x1,%esi
  jb     L139
  jmp    L98
L149:
  movabs $0xdfffbfbffffffffe,%rdx
  lea    0x20(%rsp),%r13
  bt     %rax,%rdx
  mov    %r13,%rdx
  jb     L37
  jmp    L65
L2:
  mov    %rsi,%rdi
  mov    %edx,0xc(%rsp)
  call   <get_action_class@plt>
  mov    0xc(%rsp),%edx
  test   %rax,%rax
  mov    %rax,%rbp
  jne    L125
L53:
  xor    %eax,%eax
L294:
  mov    0x68(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L30
  add    $0x70,%rsp
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L80:
  lea    0x40(%rsp),%r15
  mov    %r12,%rsi
  mov    $0x20,%edx
  mov    %r15,%rdi
  call   <get_sv_ftype@plt>
  mov    %r12,%rsi
  mov    %r15,%rdi
  mov    $0x20,%edx
  mov    %eax,%ecx
  mov    %eax,%r14d
  call   <get_sv_flen@plt>
  mov    %r13,%rdi
  mov    %eax,%r12d
  call   <strlen@plt>
  test   %eax,%eax
  jle    L53
  mov    %r12d,%ecx
  mov    %r14d,%edx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <ssds_find_field@plt>
  jmp    L294
L292:
  mov    %r13,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  je     L257
  movzbl 0x20(%rsp),%eax
  cmp    $0x30,%al
  jne    L56
  movsbl 0x21(%rsp),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L252
  movzbl 0x20(%rsp),%eax
  jmp    L56
L252:
  lea    0x18(%rsp),%rdx
  lea    D18(%rip),%rsi
  mov    %r13,%rdi
  call   <sscanf@plt>
  test   %eax,%eax
  je     L53
  mov    0x18(%rsp),%esi
  mov    %rbp,%rdi
  call   <ssds_get_field_num@plt>
  jmp    L294
L257:
  xor    %esi,%esi
  mov    %rbp,%rdi
  movl   $0x0,0x18(%rsp)
  call   <ssds_get_field_num@plt>
  jmp    L294
L30:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: label: D12
type_infered: string
name: unpack_data
arguments: label: D18
type_infered: string

tool: D12: %d

tool: D18: 0%d

assistant: ```c
struct ssds_field *get_action_field(struct ssds_class *pclass, char *saction, int num) {
  int ret;
  int res;
  int id;
  struct ssds_field *pfield;
  char *sp;
  char *spn;
  char name[32];
  char f_type[32];
  int ftnum;
  int ftlen;
  pfield = NULL;
  if (!pclass) {
    pclass = get_action_class(saction);
  }
  if (pclass) {
    sp = saction;
    while (num--) {
      while (*sp && (*sp != '.') && (*sp != '=') && (*sp != '&'))
        sp++;
      if (*sp == '.')
        sp++;
    }
    spn = name;
    while (*sp && (*sp != '.') && (*sp != '=') && (*sp != '&')) {
      *spn++ = *sp++;
    }
    *spn = 0;
    sp = name;
    ret = -1;
    if ((*sp == '0') && (strlen(name) == 1)) {
      ret = 0;
      pfield = ssds_get_field_num(pclass, ret);
    } else if (*sp == '0' && (isdigit(*(sp + 1)))) {
      res = sscanf(sp, "0%d", &ret);
      if (res)
        pfield = ssds_get_field_num(pclass, ret);
    } else if (isdigit(*sp)) {
      res = sscanf(sp, "%d", &id);
      if (res)
        pfield = ssds_get_field_id(pclass, id);
    } else {
      ftnum = get_sv_ftype(f_type, saction, 32);
      ftlen = get_sv_flen(f_type, saction, 32, ftnum);
      if (strlen(name) > 0)
        pfield = ssds_find_field(pclass, name, ftnum, ftlen);
    }
  }
  return pfield;
}
```