Парсер коммандной строки

Тема в разделе "WASM.A&O", создана пользователем zzzyab, 17 сен 2004.

  1. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Как это можно оптимизировать ?

    ;esi указатель на комм. строку
    Код (Text):
    1.     mov al,byte ptr [esi]
    2.     test    al,al
    3.     ja  params_found
    4.     mov ecx,SIZEOF Usage_str
    5.     mov esi,offset Usage_str
    6.         call    cStdOut
    7.     jmp quit
    8. skip_spaces:
    9.     xor ah,ah
    10.     and byte ptr [esi],0
    11. next_byte:
    12.     inc esi
    13.     mov al,byte ptr [esi]
    14. params_found:
    15.     cmp al,20h
    16.     je  skip_spaces
    17.     ja  nonspace_present
    18.     cmp al,0
    19.     ja  invalid_param
    20.     je  end_of_string
    21. nonspace_present:
    22.     and ah,1
    23.     jnz next_byte
    24.     or  ah,1
    25.     cmp al,2fh
    26.     je  options_present
    27.       mov   edx,[fname]
    28.     and edx,-1
    29.     jz  take_main_param
    30.     jmp too_many_parans
    31. take_main_param:   
    32.         mov     [fname],esi
    33.     jmp next_byte
    34. options_present:
    35.    
    36. ;разбор параметров
    37.       jmp   next_byte
    38. end_of_string:
    39.         mov     edx,[fname]
    40.     and edx,-1
    41.     jnz needed_params_present  
    42. missing_main_param:
    43.     mov ecx,SIZEOF nema_parametra_str
    44.     mov esi,offset nema_parametra_str
    45.         call    cStdOut
    46.     jmp quit
    47. too_many_parans:
    48.     mov ecx,SIZEOF too_many_parans_str
    49.     mov esi,offset too_many_parans_str
    50.         call    cStdOut
    51.     jmp quit
    52. invalid_param:
    53.     mov ecx,SIZEOF invalid_param_str
    54.     mov esi,offset invalid_param_str
    55.         call    cStdOut
    56.     jmp quit
    57.  
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Как минимум это
    Код (Text):
    1. call  cStdOut


    можно сделать через регистр



    всё остальное требует больше данных, что ищет парсер?, если только параметры командной строки, не проверяя сами эти параметры, то можно сделать короче, что за функция cStdOut ?
     
  3. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Параметры проверяются и разбиваются на группы, не копируются никуда. Скорсть не критична а вот размер хотел бы уменьшить.

    сStdout - вывод в stdout
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Не вникая в принцип работы, можно сразу делать такие замены:
    Код (Text):
    1.  
    2.     xor ah,ah
    3.     and byte ptr [esi],0
    4. на
    5.     xor ah,ah
    6.     and byte ptr [esi],ah
    7.  
    8.     cmp al,0
    9. на
    10.     test    al,al
    11.  
    12.  
    13.     and ah,1
    14. на
    15.     and ah,ah
    16.  
    17.  
    18.     and edx,-1
    19. на
    20.     and edx,edx
    21.  
    22. Ещё, если операнд <=127
    23.     mov ecx,SIZEOF Usage_str
    24. то лучше
    25.     push    SIZEOF Usage_str
    26.     pop ecx
    27.  
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754