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

Discussion in 'WASM.BEGINNERS' started by device, Nov 27, 2007.

  1. device

    device Reflection

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    1,198
    Location:
    RF
    В main( argc, argv, env)
    env хранится в стеке в виде указателя на массив ( как я понял:) )

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

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

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

    IceStudent Active Member

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    Там хранятся строки вида "name=value". Вывести просто:
    Code (Text):
    1. for(int i = 0; envp[i]; i++)
    2.     puts(envp[i]);
     
  3. device

    device Reflection

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    1,198
    Location:
    RF
    IceStudent
    Я уже вывел их на СИ:)

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

    IceStudent Active Member

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    device
    А откуда в ассемблере main? Или ты опять смешиваешь что-то? :)
     
  5. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    можт в РЕВ, да и апишка вроде есть для получения. типа getenvironment..
     
  6. device

    device Reflection

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    1,198
    Location:
    RF
    Да нет, я сравниваю.
    Говорю: в Си в методе Майн - это env, а в ассемблере - это в стеке храниццо в виде указателя.
    Блин, как на асме вывести содержимое env[][]?
     
  7. Mika0x65

    Mika0x65 New Member

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

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

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

    Code (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

    Blog Posts:
    0
    Joined:
    Oct 5, 2003
    Messages:
    1,706
    Mika0x65
    пропустил инкремент индекса
    + afaik сохранность eax не гарантируется, более того printf возвращает в нем
     
  9. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    q_q
    Угу, это я скопировал неправильно из NotePad, а про еах забыл :dntknw:.

    Code (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

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    1,198
    Location:
    RF
    Mika0x65
    Помогло.

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

    только не так

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

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

    nester7 New Member

    Blog Posts:
    0
    Joined:
    Dec 5, 2003
    Messages:
    720
    Location:
    Russia
    [-]
    Ступил.
     
  12. device

    device Reflection

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    1,198
    Location:
    RF
    В работе разобрался, но

    Code (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

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    1,198
    Location:
    RF
    nester7
    Все работает
    Тока нафига в AH 0ah?
     
  14. nester7

    nester7 New Member

    Blog Posts:
    0
    Joined:
    Dec 5, 2003
    Messages:
    720
    Location:
    Russia
    st: db "MyTextString",0ah
     
  15. SII

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

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    device

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

    device Reflection

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    1,198
    Location:
    RF
    SII
    теперь я ступил:)
     
  17. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    SII
    AFAIK работает SUB быстрее. Я вообще вычитаю теперь единицу всегда так: ADD EAX,-1h.