Работа с массивом.

Тема в разделе "WASM.BEGINNERS", создана пользователем device, 27 ноя 2007.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    В main( argc, argv, env)
    env хранится в стеке в виде указателя на массив ( как я понял:) )

    Как вывести переменные окружения (), то есть как работать с таким массивом?

    Я вывел их на СИ.
    Получил структуру

    [key][value] - Альтернатива Hashtable.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Там хранятся строки вида "name=value". Вывести просто:
    Код (Text):
    1. for(int i = 0; envp[i]; i++)
    2.     puts(envp[i]);
     
  3. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    IceStudent
    Я уже вывел их на СИ:)

    Пытаюсь на ассемблере это сделать.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    device
    А откуда в ассемблере main? Или ты опять смешиваешь что-то? :)
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    можт в РЕВ, да и апишка вроде есть для получения. типа getenvironment..
     
  6. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Да нет, я сравниваю.
    Говорю: в Си в методе Майн - это env, а в ассемблере - это в стеке храниццо в виде указателя.
    Блин, как на асме вывести содержимое env[][]?
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    device
    Правильнее сказать, что это в С указатель хранится в стеке. Вопрос в том, кто туда его положит? Это должна сделать т.н. CRT -- библиотека поддержки выполнения С-программы. При запуске исполняемого, написаного на С, управление получает код CRT, который выполняет некоторую инициализацию, в том числе и подготовку переменных окружения, кладет это дело в стек, и вызывает main.

    В случае ассемблера никакой CRT нет, и ее работу придется сделать вам самим, с помощью WIN32 API.

    Ну а если подготавливать переменные окружения лень, то можно использовать __asm вставку в С:

    Код (Text):
    1.  mov eax, [env]
    2. l00p:
    3.  cmp [eax], 0x0
    4.  jz .end_l00p
    5.  push dword ptr [eax]
    6.  call printf
    7.  add esp, 0x4
    8.  jmp l00p
    9. end_l00p:
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Mika0x65
    пропустил инкремент индекса
    + afaik сохранность eax не гарантируется, более того printf возвращает в нем
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    q_q
    Угу, это я скопировал неправильно из NotePad, а про еах забыл :dntknw:.

    Код (Text):
    1.  push ebx
    2.  mov ebx, [env]
    3. l00p:
    4.  cmp [ebx], 0x0
    5.  jz .end_l00p
    6.  push dword ptr [ebx]
    7.  call printf
    8.  add esp, 0x4
    9.  add ebx, 0x4
    10.  jmp l00p
    11. end_l00p:
    12.  pop ebx
     
  10. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Mika0x65
    Помогло.

    Еще вопрос:
    Как узнать длину текстовой строки?

    только не так

    st: db "MyTextString",0ah
    st_len: equ $-st

    Допустим, я эту строку собираюсь прочитать и не знаю, какого она размера.
     
  11. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    [-]
    Ступил.
     
  12. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    В работе разобрался, но

    Код (Text):
    1.       mov al, 0ah
    2.       mov esi, string
    3.       mov edi, esi
    4.       repne scasb
    5.       sub edi, esi
    6.       mov eax,edi
    7.       sub eax,1 ; Приходится вычитать, а то данные не точные
    8.       mov i,eax
     
  13. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    nester7
    Все работает
    Тока нафига в AH 0ah?
     
  14. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    st: db "MyTextString",0ah
     
  15. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    device

    Если уж уменьшать регистр на 1, то не SUB, а DEC. Работать и SUB будет, но места в памяти больше занимает :)
     
  16. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    SII
    теперь я ступил:)
     
  17. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    AFAIK работает SUB быстрее. Я вообще вычитаю теперь единицу всегда так: ADD EAX,-1h.