получение параметров командной строки

Тема в разделе "WASM.UNIX", создана пользователем freeze_foton, 25 дек 2004.

  1. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
    товарищи никсоиды, подскажите плз, как передать в программу аргументы командной строки на асме?

    что-то типа "main (int argc, char **argv) {}" на си
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Для юникса... Не заметил.
     
  3. Qwer

    Qwer New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2005
    Сообщения:
    6
    Прочитать файл /proc/self/cmdline :derisive:

    Незнаю как для всех никсов, но в Линукс работает.
     
  4. oxid

    oxid New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    6
    Адрес:
    Russia
    Параметры в функцию майн передаются как в любую другую функцию.
     
  5. intuit

    intuit New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2003
    Сообщения:
    28
    шо тут сложного



    к примеру
    Код (Text):
    1.  
    2. main:
    3.         pushl   %ebp
    4.         movl    %esp,     %ebp
    5.         subl    $24,      %esp
    6.       [b]movl   12(%ebp), %eax[/b]
    7.       [b]addl   $4,       %eax[/b] <<--- в eax *argv[1]
    8.         ...
    9.  
     
  6. unixoid

    unixoid New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2005
    Сообщения:
    31
    Адрес:
    Ukraine
    intuit

    oxid

    Функция main() вызывается другими процами из библиотеки crt1.o итд... Какой же тогда прикол писать на асме, если использовать libc? :)

    Хотя все почти то же...



    По умолчанию ELF лоадер начинает выполнять наш код с публической метки _start...

    В это время в стеке мы имеем(начиная с дна)(все двоичные слова):

    <eip> (вернее какую-то дрянь, при возврате на нее прога вылетает аварийно)

    <pointer to commandline_arg 1>

    <pointer to commandline_arg 2>

    ....

    <zero>

    <pointer to environment var 1>

    <pointer to environment var 2>

    .....

    <zero>

    Как видно, все уже разложено по полочкам :) даже аргументы коммандной строки разделены! :))

    Как всем этим пользоваться?- да очень просто!

    Для удобства сохраним указатель стека куда-либо(создадим так назыавемый стековый фрейм:))
    Код (Text):
    1.  
    2. public _start
    3. _start:
    4.  push ebp
    5.  mov ebp,esp
    6. ; Теперь адрес нулевого аргумента(т.е. адрес имени самой комманды) коммандной строки лежит в [ebp+8]
    7. ; И все!
    8.  mov eax,[ebp+8]
    9.  mov bl,[eax] ;теперь в bl лежит первый символ :)
    10. ; И так далее... в [ebp+12] лежит адрес следующего аргумента...пока [ebp+xx] не 0....далее в [ebp+(xx+4)] лещит адрес первой env-переменной
    11.  mov eax,[ebp+24] ;в eax теперь лежит адрес строки "TERM=cons25r"
    12.  


    Вот так вот..Все строки нуль-терминированы...

    Пример:

    ./bla arg1 arg2


    Код (Text):
    1.  
    2. public _start
    3. _start:
    4.  push ebp
    5.  mov ebp,esp
    6. ;печатаем аргументы
    7.  push dword [ebp+12]
    8.  call my_printstr
    9.  push dword [ebp+16]
    10.  call my_printstr
    11. ;печатаем пару env-variables
    12.  push dword [ebp+24] ;по скольку в [ebp+20] лежит нолик - у нас же два аргумента
    13.  call my_printstr
    14.  push dword [ebp+28]
    15.  call my_printstr
    16. ;Выходим
    17.  push 0
    18.  call my_exit
    19. ;Восстанавливать esp и ebp не требуется :)
    20.  
    21. В итоге на экране напечаталось:
    22. arg1arg2TERM=cons25rTEMP=/tmp
    23.  


    Вот и все:)



    PS. Пишу свой движок для форума на асме под FreeBSD :) все приходится делать руками и исследовать саму ось...а сколько еще всего в переди...
     
  7. intuit

    intuit New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2003
    Сообщения:
    28
    btw, я опечатался..

    не "addl $4, %eax <<--- в eax *argv[1]"

    а "addl $4, %eax <<--- в eax argv[1]"
     
  8. B_108

    B_108 New Member

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