В main( argc, argv, env) env хранится в стеке в виде указателя на массив ( как я понял ) Как вывести переменные окружения (), то есть как работать с таким массивом? Я вывел их на СИ. Получил структуру [key][value] - Альтернатива Hashtable.
Там хранятся строки вида "name=value". Вывести просто: Код (Text): for(int i = 0; envp[i]; i++) puts(envp[i]);
Да нет, я сравниваю. Говорю: в Си в методе Майн - это env, а в ассемблере - это в стеке храниццо в виде указателя. Блин, как на асме вывести содержимое env[][]?
device Правильнее сказать, что это в С указатель хранится в стеке. Вопрос в том, кто туда его положит? Это должна сделать т.н. CRT -- библиотека поддержки выполнения С-программы. При запуске исполняемого, написаного на С, управление получает код CRT, который выполняет некоторую инициализацию, в том числе и подготовку переменных окружения, кладет это дело в стек, и вызывает main. В случае ассемблера никакой CRT нет, и ее работу придется сделать вам самим, с помощью WIN32 API. Ну а если подготавливать переменные окружения лень, то можно использовать __asm вставку в С: Код (Text): mov eax, [env] l00p: cmp [eax], 0x0 jz .end_l00p push dword ptr [eax] call printf add esp, 0x4 jmp l00p end_l00p:
Mika0x65 пропустил инкремент индекса + afaik сохранность eax не гарантируется, более того printf возвращает в нем
q_q Угу, это я скопировал неправильно из NotePad, а про еах забыл . Код (Text): push ebx mov ebx, [env] l00p: cmp [ebx], 0x0 jz .end_l00p push dword ptr [ebx] call printf add esp, 0x4 add ebx, 0x4 jmp l00p end_l00p: pop ebx
Mika0x65 Помогло. Еще вопрос: Как узнать длину текстовой строки? только не так st: db "MyTextString",0ah st_len: equ $-st Допустим, я эту строку собираюсь прочитать и не знаю, какого она размера.
В работе разобрался, но Код (Text): mov al, 0ah mov esi, string mov edi, esi repne scasb sub edi, esi mov eax,edi sub eax,1 ; Приходится вычитать, а то данные не точные mov i,eax
device Если уж уменьшать регистр на 1, то не SUB, а DEC. Работать и SUB будет, но места в памяти больше занимает