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

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

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Это интересно. Возможно лучший вариант.

    А что на счёт массива указателей? Никто не ответил. Как этот массив лучше получить? Вручную, при добавлении новой переменной сохранять её offset в переменную-указатель (для каждой переменной mov X,offset var1 или lea X, var1)? Просто, получается не очень красиво.
     
  2. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Да, некрасиво:
    Код (Text):
    1. value1 dd ?
    2. value2 db 1, 2, 3, 0
    3. value3 db ?
    4. value4 dq ?
    5. value5 dw ?
    6. arrayOffsets value1, value2, value3, value4, value5
    7. arrayLength = ($ - arrayOffsets)/4
    Скажи спасибо, что ещё самому адреса вычислять не нужно)
     
  3. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Код (Text):
    1. ...
    2. arrayOffsets dd ...
    3. ...
     
  4. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Да, и как сказал deLight, не забудь завести второй массив с названием arrayLengths, в котором будешь хранить тип переменной, на который указывает указатель из первого массива, а иначе как же ты узнаешь, как его обрабатывать ;)
     
  5. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    irrona
    Как интересно! Примерчик можно?
     
  6. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Попробуй написать парсер который корректно создаст описатели.

    Я попробовал макросы но MASM подставляет какую-то чушь вместо оффсетов:

    Код (Text):
    1. tKeyData struc
    2. part1       dd ?
    3. key1_addr   dd ?
    4. var1        dd ?
    5. var_type1   dd ?
    6. value1_addr dd ?
    7. struc_size  dd ? ; Size of allocated data
    8. tKeyData ends
    9.  
    10. DefineDataByRef macro part1,key1_addr,var1,var_type1,value1_addr:REQ
    11. ;;.data
    12.   local @@key1_L,@@value1_L,@@EndOffs
    13.   CurrOfs = $
    14.   ; Define structure
    15.   tKeyData <part1,?,var1,var_type1,?,?>
    16.   ;;Key1Offs = $
    17.   @@key1_L:
    18.   Key1Offs = @@key1_L
    19.   db key1_addr
    20.   db 0
    21.   @@value1_L:
    22.   db value1_addr
    23.   db 0
    24.   @@EndOffs:
    25.   org CurrOfs
    26.   ;;tKeyData  <part1,Key1Offs,var1,var_type1,value1Offs,EndOffs>
    27.   tKeyData <part1,Key1Offs,var1,var_type1,offset @@value1_L,offset @@EndOffs>
    28.   org offset @@EndOffs ;;EndOffs
    29. ;;.code
    30. endm
    31. ...
    32.   jmp @@Skip
    33. ;.data
    34. MyArray dd 0
    35. ;.code
    36. DefineDataByRef HKEY_LOCAL_MACHINE,"SOFTWARE1\...",0,REG_SZ,"1"
    37. DefineDataByRef HKEY_LOCAL_MACHINE,"SOFTWARE2\...",0,REG_SZ,"2"
    38. DefineDataByRef HKEY_LOCAL_MACHINE,"SOFTWARE3\...",0,REG_SZ,"3"
    39.  
    40.   @@Skip:
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    vg

    Почему бы не отпрекалькулейтить адреса переменных? Типа индексирование.
     
  8. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    неужели нельзя хранить строки отдельно а в массиве держать указатели на них?