Перебор переменных разной длины в цикле

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 26 апр 2009.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Есть множество переменных (var1, var2, var3...) разной длины, в MASM32. Каким образом выполнить их перебор в цикле?
     
  2. c4m310t

    c4m310t New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2008
    Сообщения:
    237
    что значит "перебор" ?
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    c4m310t
    обращение к каждому элементу массива
     
  4. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    c4m310t
    Приблизительно так:
    Код (Text):
    1. cycle:
    2.    mov eax, [ebx]
    3.    inc ebx
    4.    loop cycle
    , где в ebx перед циклом хранится первый элемент массива указателей на переменные.
     
  5. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Phuntik
    ответ не верный..сказано же..разной длинны
    этот способ походит только для переменных одинаковой размерности)
     
  6. c4m310t

    c4m310t New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2008
    Сообщения:
    237
    .DATA
    Var1 db 10 dup(0) ; Твоя переменная

    .CODE
    .............

    mov eax, offset Var1
    mov ch, 10

    cycl:
    cmp ch, 0
    jz next

    mov cl, byte ptr [eax] ; текущий байт переменной
    push cl ; делаешь что нить с ним...

    inc eax ; след байт...

    dec ch ; счетчик уменьшаешь на 1
    jmp cycl

    next:

    .....
    дальше....
     
  7. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Phuntik, featurelles
    кхе...

    vg
    если разной длины, то как ты хочешь определять длину текущего элемента?
    по какому-то правилу или задать дополнительный массив, содержащий длину каждого элемента из твоих (var1, var2, var3...) соответственно? проще и быстрее будет - отдельно переменные db, отдельно dw, dd и так далее. не пойму, в чем тут у тебя возникла проблема?
     
  8. c4m310t

    c4m310t New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2008
    Сообщения:
    237
    featurelles
    Хм, а можно взглянуть, на то, как Вы это видите ?
    ----
    2 ТС Вам нужно в 1 цикле все ?
     
  9. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    c4m310t
    щас какрас пишу.... подождите немного)
     
  10. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Описываю задачу полностью.
    Нужна функция изменяющая значения в реестре. Значения берутся из
    Код (Text):
    1. part1_1_1     dd HKEY_CURRENT_USER
    2. key1_1_1      db "SOFTWARE\...",0
    3. var1_1_1      db "var1",0
    4. var_type1_1_1 dd REG_SZ
    5. value1_1_1    db "1",0
    6.  
    7. part1_2_1     dd HKEY_LOCAL_MACHINE
    8. key1_2_1      db "SOFTWARE\...",0
    9. var1_2_1      db "var1",0
    10. var_type1_2_1 dd REG_SZ
    11. value1_2_1    db "0",0
    12.  
    13. .
    14. .
    15. .
    16.  
    17. part1_n_1     dd HKEY_LOCAL_MACHINE
    18. key1_n_1      db "SOFTWARE\...",0
    19. var1_n_1      dd 0
    20. var_type1_n_1 dd REG_SZ
    21. value1_n_1    db "1",0
    Когда значений много, хотелось бы вызывать функцию в цикле.
     
  11. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    c4m310t
    написал достаточно хороший алгоритм. но он работает только, если разные размерности в массиве, находятся в одинаковом колличестве.
    например.
    dd dd dd dw dw dw db db db .. =(
     
  12. c4m310t

    c4m310t New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2008
    Сообщения:
    237
    2 featurelles
    Причем последовательно ?

    Ну тогда это почти тоже самое...
     
  13. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    vg
    добавь var1_n_1_size db, где храни размер var1_n_1.
    в структуре расположи этот байт _перед_ var1_n_1, чтобы размер можно было прочитать по фиксированному смещению относительно начала. всё.
     
  14. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    или храни размеры соответствующих элементов в отдельном массиве, тогда проще будет индексировать исходный, т.к. не придется пробегать по всем элементам, стоящим перед искомым, складывая смещения.
     
  15. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Нужен массив указателей на элементы (как Phutnik и показал). Если такого массива нет, значит дизайн программы неверен. Единственное, что было неверно в коде Phutnika-а - это надо EBX продвигать не на один байт (INC EBX), а на размер указателя (4 байта для 32-битного кода и 8 байт для 64-битного).
     
  16. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    AsmGuru62, угу. лучший вариант.
    что-то я какую-то пургу нес...
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ответ верный, сказано же..массив указателей.
     
  18. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    не было первоначально мной замечено..
     
  19. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    А как этот массив получить? Вручную, при добавлении новой переменной сохранять её offset в переменную-указатель? Можно пример для моих переменных из поста #10?
     
  20. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    а можно и измерять элементы перед использованием. sizeof и lengthof еще никто не отменял.