Показать сообщение отдельно

Get Command Line Arguments
  #7  
Старый 07.01.2007, 20:37
hidden
Постоянный
Регистрация: 23.04.2006
Сообщений: 622
Провел на форуме:
5887054

Репутация: 1292


По умолчанию Get Command Line Arguments

Алгоритм: Get Command Line Arguments
Синтаксис: fasm
Описание: Самая частоиспользуемая функция после импортера. При написании какой нибудь маленькой консольной(и не только) утилиты, бывает очень нужно получить аргументы коммандной строки.
Змечания: Данная функция защищена от переполнения, указываемая в последним аргументе длина указывается включая нулевой окончательный символ. Если длина 4, в буффер поместятся только 3 символа аргумента и 1 конца строки. В eax возвращается длина полученого аргумента, если его не нашлось, возвращасется 0, при этом в буффер ничего не записывается, так что можно предопределять аргументы.
Пример вызова:
Код:
format PE GUI 4.0
entry start

include 'win32a.inc'
include 'ulils.inc'

myi:
  iprc LoadLibraryA, 'LoadLibraryA',\
   GetCommandLineA,'GetCommandLineA'
  imod user, 'user32'
  iprc MessageBoxA, 'MessageBoxA'
  endi
  istr user

start:
        stdcall importer, [esp+4], myi
        
        stdcall GetCommandLineA
        mov     [arg], eax

        stdcall GetArg, [arg], 1, Message, 64
        stdcall MessageBoxA, 0, Message, tit1, 0

        stdcall GetArg, [arg], 2, Message, 64
        stdcall MessageBoxA, 0, Message, tit2, 0

        ret

 arg            dd ?
 tit1           db 'Arg number 1',0
 tit2           db 'Arg number 2',0
 Message        db 64 dup(?)
Код:
proc GetArg, line, num, buf, len
        xchg    esi, [line]
        xchg    edi, [buf]
        xchg    ecx, [num]
        dec     [len]

        jecxz   .cur

 .lp1:  lodsb
        or      al, al
        jz      .ret
        cmp     al, '"'
        jne     .nq1

 .lp2:  lodsb
        or      al, al
        jz      .ret
        cmp     al, '"'
        jne     .lp2
        lodsb
        or      al, al
        jz      .ret
        cmp     al, '"'
        je      .lp2

 .nq1:  cmp     al, ' '
        jne     .lp1

 @@:    lodsb
        cmp     al, ' '
        je      @b
        dec     esi

        loop    .lp1

 .cur:  mov     ecx, [len]
 .lp3:  lodsb
        or      al, al
        jz      .end
 .chs:  cmp     al, ' '
        je      .end
        cmp     al, '"'
        jne     .nq2

 .gq2:  lodsb
        or      al, al
        jz      .ret
        cmp     al, '"'
        jne     .gq1

 .nq2:  stosb
        loop    .lp3

 .end:  mov     eax, [len]
        sub     eax, ecx
        jz      .ret
        mov     byte[edi], 0
        inc     edi
 .ret:  mov     esi, [line]
        mov     edi, [buf]
        mov     ecx, [num]
        ret

 .lp4:  lodsb
        or      al, al
        jz      .ret
        cmp     al, '"'
        jne     .gq1

        lodsb
        or      al, al
        jz      .ret
        cmp     al, '"'
        jne     .chs

 .gq1:  stosb
        loop    .lp4
        jmp     .end

 .err:  xor     eax, eax
        jmp     .ret
endp
Updates: Теперь игнорирует повторяющиеся пробелы между аргументами

Последний раз редактировалось hidden; 12.01.2007 в 07:54..
 
Ответить с цитированием