Заполнение массива значениями

Тема в разделе "WASM.ASSEMBLER", создана пользователем AlKuzVik, 17 дек 2011.

  1. AlKuzVik

    AlKuzVik New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    9
    Есть массив:
    Код (Text):
    1.   Array rb 100h
    Заполняю его значениями:
    Код (Text):
    1.         mov     dword[Array],1
    2.         mov     dword[Array+4],2
    3.         mov     dword[Array+8],3
    Вопрос:
    Как автоматизировать процесс заполнения массива с помощью макросов fasm?
    сделал набросок:
    Код (Text):
    1. macro FillArray lpArray,[arg]
    2. {
    3.         mov     dword [lpArray],arg
    4. }
    но как добавить смещения +4,+8, что-то не врублюсь.
     
  2. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Код (Text):
    1. xor ecx, ecx
    2. next_dw:
    3. mov dword [Array+ecx*4], ecx
    4. add ecx, 1
    5. cmp ecx, [NumOfElems]
    6. jnz next_dw
    Без макросов так не?
     
  3. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    С макросами: times сколько_двордов mov [Array+(% - 1) * 4],%
     
  4. AlKuzVik

    AlKuzVik New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    9
    Задача не так проста как мне казалось, потому что значением может быть как регистр так и ячейка памяти.
    И еще, если значений не так много, то можно обойтись mov'ами, а если их куча, то реализовывать через цикл.
    То есть надо как-то в макросе определить сколько параметров ему передалось.

    Вообщем хочу что-то вроде заполнения динамического массива:
    FillArray Array,4,[mem],eax,ecx,edx
     
  5. AlKuzVik

    AlKuzVik New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    9
    Вот сделал:
    Код (Text):
    1. macro FillArray lpArray,nSizeArray,[arg]
    2. {
    3. common
    4.   local count
    5.   count = 0
    6. forward
    7.   count = count + 4
    8. common
    9.   if count > nSizeArray
    10.     display 'Error: overflow of the array.',0Dh,0Ah
    11.     err
    12.   end if
    13. common
    14.   local id
    15.   id = 0
    16. forward
    17.   if arg eqtype [0]
    18.     push    dword arg
    19.     pop     dword [lpArray+id*4]
    20.   else
    21.     mov     dword [lpArray+id*4],arg
    22.   end if
    23.     id = id + 1
    24. common
    25.     mov     eax,id
    26. }
    Если общий размер аргументов больше размера массива, то на этапе компиляции выдается ошибка.
    Если какой-либо аргумент ячейка памяти, то используем конструкцию push/pop, иначе копируем командой mov.
    После использования макроса в eax количество переданных параметров.

    Теперь удобно заполнять массив значениями:
    Код (Text):
    1. FillArray Array,100h,eax,ecx,edx,esi,edi,ebx,[Value],8,9