отправить параметры -> argv

Тема в разделе "WASM.ASSEMBLER", создана пользователем NoName, 18 июн 2008.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Нужно сделать эмуляцию "char ** argv" на ассемблере.
    Т.е. есть функция типо main, в нее нужно передать параметры таким стандартным способом в 32-х разрядной среде.
    Параметры уже есть. Вопрос как их оптимально и безопасно передать.

    Я это себе представляю так:
    1. Завожу участок памяти (буфер) определенного, необходимого размера.
    2. Инициализирую перменную argv адресом на этот буфер.
    В буфере идут просто строки с разделяющими ноликами.
    Может нужно сделать массив адресов на строки?

    Я правильно понял или нет? Может еще нужно выравнивание както учитывать?
    Или наверное что то с адресацией... вообщем недогоняю.
     
  2. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Речь идет о своей ОС? Если да, то наличие/отсутствие выравнивания твое личное дело.

    Если параметры "уже есть", то зачем выделять дополнительный буфер? Потребуется кусок памяти, размером (кол-во_параметров + 1) * размер_указателя (4 байта, если речь про 32 бита), кусок памяти надо проинициализировать адресами параметров в том порядке, как они были переданы программе. Последнее значение массива указателей обычно NULL, поэтому к количеству параметров прибавлена единица.

    Адрес этого куска памяти (массива указателей) передается в main через стек.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Было бы неплохо составить таблицу адресов, ведь char** это по сути и есть оно.
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    да. смотри:
    Код (Text):
    1. buf = 'Hello world! It is me!', 0
    2. tbl = -^, ---^, ----^, ^, ^, 0;
    3. chr = &tbl
    Под символами ^ или -^ имеются ввиду указатели на байты. Оформляется это так
    Код (Text):
    1. ...
    2. ;сохраним значение esp, для того чтобы не считать количество элементов получившегося массива
    3. mov edx, esp
    4. ;возбмем буфер и посчитаем его длину
    5. mov esi, buf
    6. xor ecx, ecx
    7. @@:
    8. cmp byte [esi+ecx], 0
    9. jz @f
    10. inc ecx
    11. jmp @b
    12. @@:
    13. ;если буфер пуст, то ecx=0
    14. jecxz @f
    15. ;с конца к началу сканируем буфер и ищим все пробелы заменяя их 0 и сохраняя предыдущую позицию в стеке
    16. dec ecx
    17. cmp byte [esi+ecx], 32
    18. jnz @b
    19. lea eax, [esi+ecx+1]
    20. cmp byte [eax], 0
    21. jz @b
    22. cmp byte [eax], 32
    23. jz @b
    24. mov byte [esi+ecx], 0
    25. push eax
    26. jmp @b
    27. @@:
    28. ;в начале буфера скорее всего не будет пробела, а первый параметр начинается именно там
    29. cmp [esp], esi
    30. jz @f
    31. push esi
    32. @@:
    33. ;сохраним значение esp до формирования массива
    34. push edx
    35. ;ссылка на массив ссылок
    36. push esp
    37. call main
    38. ;не забываем выкинуть массив из стека
    39. pop eax
    40. mov esp, eax
    41. ...