|
Постоянный
Регистрация: 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..
|