Нужно сделать эмуляцию "char ** argv" на ассемблере. Т.е. есть функция типо main, в нее нужно передать параметры таким стандартным способом в 32-х разрядной среде. Параметры уже есть. Вопрос как их оптимально и безопасно передать. Я это себе представляю так: 1. Завожу участок памяти (буфер) определенного, необходимого размера. 2. Инициализирую перменную argv адресом на этот буфер. В буфере идут просто строки с разделяющими ноликами. Может нужно сделать массив адресов на строки? Я правильно понял или нет? Может еще нужно выравнивание както учитывать? Или наверное что то с адресацией... вообщем недогоняю.
Речь идет о своей ОС? Если да, то наличие/отсутствие выравнивания твое личное дело. Если параметры "уже есть", то зачем выделять дополнительный буфер? Потребуется кусок памяти, размером (кол-во_параметров + 1) * размер_указателя (4 байта, если речь про 32 бита), кусок памяти надо проинициализировать адресами параметров в том порядке, как они были переданы программе. Последнее значение массива указателей обычно NULL, поэтому к количеству параметров прибавлена единица. Адрес этого куска памяти (массива указателей) передается в main через стек.
да. смотри: Код (Text): buf = 'Hello world! It is me!', 0 tbl = -^, ---^, ----^, ^, ^, 0; chr = &tbl Под символами ^ или -^ имеются ввиду указатели на байты. Оформляется это так Код (Text): ... ;сохраним значение esp, для того чтобы не считать количество элементов получившегося массива mov edx, esp ;возбмем буфер и посчитаем его длину mov esi, buf xor ecx, ecx @@: cmp byte [esi+ecx], 0 jz @f inc ecx jmp @b @@: ;если буфер пуст, то ecx=0 jecxz @f ;с конца к началу сканируем буфер и ищим все пробелы заменяя их 0 и сохраняя предыдущую позицию в стеке dec ecx cmp byte [esi+ecx], 32 jnz @b lea eax, [esi+ecx+1] cmp byte [eax], 0 jz @b cmp byte [eax], 32 jz @b mov byte [esi+ecx], 0 push eax jmp @b @@: ;в начале буфера скорее всего не будет пробела, а первый параметр начинается именно там cmp [esp], esi jz @f push esi @@: ;сохраним значение esp до формирования массива push edx ;ссылка на массив ссылок push esp call main ;не забываем выкинуть массив из стека pop eax mov esp, eax ...