Page 1 of 1

Модуль для разбора параметров командной строки [FASM]

Posted: Thu Sep 12, 2013 11:29 pm
by Akyltist
Писалось для своих нужд, возможно кому-то будет полезным.
download/file.php?id=5166
Полезные мелочи:
- пути могут содержать любое количество пробелов (но не табов)
- пробелы в параметрах типа "my folder/file.me" не учитываются и считаются за один параметр


Функции:
__get_param_count - возвращает общее количество параметров

Code: Select all

на входе: esi -> указатель на строку с параметрами
на выходе: eax -> число параметров
портит: eax
__get_param_str - возвращает параметр по порядковому номеру

Code: Select all

на входе: esi -> указатель на строку с параметрами
на входе: eax -> порядковый номер параметра, который требуется вернуть
на выходе: eax -> длина в символах возвращаемого параметра
на выходе: edx -> указатель на буффер в который записан параметр
портит: eax,edx
Применение:
example.asm

Code: Select all

  use32
  org	 0x0

  db	 'MENUET01'
  dd	 0x01
  dd	 START
  dd	 I_END
  dd	 0x1000
  dd	 0x1000
  dd	 APP_PARAM  ; ----> ! ВАЖНО
  dd	 0x0

START:
    mov     esi, APP_PARAM ; строка с параметрами
    call  __get_param_count ; вызываем функцию
    mov     [count],eax ; получили в eax общее количество переданных параметров

    mov     esi, APP_PARAM ; строка с параметрами (необязательно, т.к. esi не испорчен)
    mov     eax,2 ; просим вернуть 2 параметр ввиде строки
    call  __get_param_str ; вызываем функцию
    mov     [paramlen],eax; получили длину символов 2го параметра
    ; edx - хранит указатель на строку (256 byte), которую впринципе можно вывести через 4ю функцию
    ;...
    ;...
    include "getparam.asm";
    ;...
    ;...

    APP_PARAM dd 256 dup(0)
    count    dd 0
    paramlen    dd 0
getparam.asm

Code: Select all

    GP_BUFF_SIZE equ 64 ; максимальная длина возвращаемого параметра (одного) 64*4 (dd) = 256 байт
Примеры:

Code: Select all

example.bin   /a   /b="immortal/good.png" /t="sys/my folder/1.png"    +O -Y  #23
__get_param_count вернет: 6
__get_param_str вернет:
 /a
 /b="immortal/good.png"
 /t="sys/my folder/1.png"
 +O
 -Y
 #23
Планы:
__get_param_type - возвращает типы
- строка (/t) (+IO) (time)
- структура (a=****)
- путь (".....")
- целочисленное (5)
- дробное (2.71)
- hex (0x0...)
__get_param_name - возвращает имя параметра если его тип "структура"
__get_param_value - возвращает значение параметра если его тип "структура"
color=0x000000 - ( color - имя, 0x000000 - значение)
Image

Re: Модуль для разбора параметров командной строки [FASM]

Posted: Fri Sep 13, 2013 12:23 am
by 0CodErr
Похоже на результат работы самодельного транслятора.

Code: Select all

    dec     eax                 ; get path length

    cmp     eax,0               ; length = 0
    je      loc_gpc_end         ; goto exit
Тут cmp не нужно — dec воздействует на zero-flag.
Планы:

__get_param_type - возвращает типы
Как ты будешь строку 0123 отличать от числа 0123?

Кстати, вместе с masm32 поставляется что-то похожее(файл masm32\M32LIB\CLARGS.ASM).