мелкие вопросы по программированию assembler & winAPI

Тема в разделе "WASM.BEGINNERS", создана пользователем halkfild, 17 июл 2007.

  1. halkfild

    halkfild New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    6
    Значит вопрос..

    мне надо получить параметры запуска програмы с коммандной строки..

    вот есть код
    Код (Text):
    1. .386
    2.  
    3. .model flat,stdcall
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\kernel32.lib
    8. include \masm32\include\user32.inc
    9. includelib \masm32\lib\user32.lib
    10.  
    11. .data
    12. MsgBoxCaption  db "-=halkfild=- ",0
    13.  
    14. .data?
    15. commandStr LPSTR ?
    16.  
    17. .code
    18.  
    19. WinMain PROC
    20.    invoke GetCommandLine  
    21.    mov commandStr,eax
    22.  
    23.    invoke MessageBox, NULL, addr commandStr, addr MsgBoxCaption, MB_OK
    24.    invoke ExitProcess, NULL
    25. WinMain ENDP
    26.  
    27. end WinMain
    все работает без ошибок, но не выводит параметры которые были заданы при запуске
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Код (Text):
    1. WinMain PROC
    2.    invoke GetCommandLine  
    3.    mov commandStr,eax
    4.  
    5.    invoke MessageBox, NULL, commandStr, addr MsgBoxCaption, MB_OK
    6.    invoke ExitProcess, NULL
    7. WinMain ENDP
    GetCommandLine возвращает указатель на строку.
    соответственно commandStr должен быть dword
     
  3. halkfild

    halkfild New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    6
    благодаря FreeMan'у я уже разобрался.. весь баг был с
    Код (Text):
    1. addr
    спасибо за ответы
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    вообще-то именно это я и написал...
     
  5. halkfild

    halkfild New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    6
    RamMerLabs спасибо..

    может кто-то еще и скажет как "нормально" разбить всю переданую строку на подпараметры..
    если можна то пример кода..

    ну на составляющие типо разделитель пробел..
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    смотри парсер командной строки в пакете масма. в библиотеке masm32.lib
    исхлдники есть в том же пакете
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    CommandLineToArgvW
     
  8. halkfild

    halkfild New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    6
    розобрался... кому интересно выкидываю код.. получает первый и второй параметр
    Код (Text):
    1. .data
    2. first db 128 dup (0)
    3. second db 128 dup (0)  
    4.  
    5. .code
    6. start:
    7.     invoke GetCL, 1, addr first
    8.            invoke GetCL, 2, addr second
    9.     invoke MessageBox, NULL, addr first, addr second, MB_OK
    10.     invoke ExitProcess,0
    11. end start
     
  9. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Код (Text):
    1. ;#########################################################################
    2. ;Процедура GetArgs
    3. ;Описание:
    4. ;Разбор параметров командной строки
    5. ;Вход:  
    6. ;   Num - номер параметра
    7. ;   Buffer - буфер куда копировать параметр с данным номером
    8. ;Выход: EAX = 1 получили, иначе нет.
    9. ;#########################################################################
    10. GetArgs proc Num:dword, Buffer:dword
    11.     invoke GetCommandLine
    12.     invoke lstrcat,eax,offset Kav
    13.     .if Num==1
    14.         invoke lstrcpy,Buffer,eax
    15.         mov eax,1
    16.         ret
    17.     .endif
    18.     mov edi,eax
    19.     mov al," "
    20.     mov ecx,1000
    21.     repe scasb;Пропускаем пробелы вначале
    22.     dec edi
    23.     mov ecx,Num
    24. NextArg:
    25.     push ecx
    26.     .if byte ptr [edi]=="""";Если кавычка, то ищем следующую кавычку, иначе ищем пробел
    27.         mov al,""""
    28.         inc edi
    29.     .else
    30.         mov al," "
    31.     .endif
    32.     mov ecx,1000
    33.     repne scasb;Ищем пробел или кавычки в коммандной строке
    34.     .if al==" "
    35.         dec edi
    36.     .endif
    37.     mov al," "
    38.     mov ecx,1000
    39.     repe scasb;ищем не пробел, т.е. пропускаем пробелы
    40.     .if al==" "
    41.         dec edi
    42.     .endif
    43.    
    44.  
    45.     .if (byte ptr [edi]==0);строка закончилась
    46.         jmp EndStr
    47.     .endif
    48.     push edi;Сохраняем начало имени первого файла
    49.     .if byte ptr [edi]==""""
    50.         mov al,""""
    51.         inc edi
    52.     .endif
    53.     mov ecx,1000
    54.     repne scasb;Сканируем до пробела или до кавычек и вычисляем длину
    55.     .if al==" "
    56.         dec edi
    57.     .endif
    58.     mov ebx,1000
    59.     dec ebx
    60.     sub ebx,ecx;Теперь в ebx длинна
    61.     .if al==""""
    62.         add ebx,2
    63.     .endif
    64.     pop edi
    65.     .if dword ptr [esp]==2
    66.         invoke WriteProcessMemory,-1,Buffer,edi,ebx,0
    67.         mov eax,1
    68.         ret
    69.     .endif
    70.     pop ecx
    71.     loop NextArg
    72. EndStr:
    73.     pop ecx
    74.     xor eax,eax
    75.     ret
    76. GetArgs endp
    77. ;#########################################################################
     
  10. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    http://board.flatassembler.net/topic.php?t=6663
     
  11. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    shoo
    Сообщайте же скорее когда от и до и будем компелировать посредством gcc
     
  12. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Cock
    сёдня в абэд (12:15-12:45) перед посольством сша (макдональдс)
    если чё - звони на мобайл (у меня твоего нету)
     
  13. halkfild

    halkfild New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    6
    2 Mental_Mirror респект.. попробуем еще и это..

    2 Cock, shoo пост № 11, 12 это вы о чем??
     
  14. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    оффтоп ;)