Есть массив: Код (Text): Array rb 100h Заполняю его значениями: Код (Text): mov dword[Array],1 mov dword[Array+4],2 mov dword[Array+8],3 Вопрос: Как автоматизировать процесс заполнения массива с помощью макросов fasm? сделал набросок: Код (Text): macro FillArray lpArray,[arg] { mov dword [lpArray],arg } но как добавить смещения +4,+8, что-то не врублюсь.
Код (Text): xor ecx, ecx next_dw: mov dword [Array+ecx*4], ecx add ecx, 1 cmp ecx, [NumOfElems] jnz next_dw Без макросов так не?
Задача не так проста как мне казалось, потому что значением может быть как регистр так и ячейка памяти. И еще, если значений не так много, то можно обойтись mov'ами, а если их куча, то реализовывать через цикл. То есть надо как-то в макросе определить сколько параметров ему передалось. Вообщем хочу что-то вроде заполнения динамического массива: FillArray Array,4,[mem],eax,ecx,edx
Вот сделал: Код (Text): macro FillArray lpArray,nSizeArray,[arg] { common local count count = 0 forward count = count + 4 common if count > nSizeArray display 'Error: overflow of the array.',0Dh,0Ah err end if common local id id = 0 forward if arg eqtype [0] push dword arg pop dword [lpArray+id*4] else mov dword [lpArray+id*4],arg end if id = id + 1 common mov eax,id } Если общий размер аргументов больше размера массива, то на этапе компиляции выдается ошибка. Если какой-либо аргумент ячейка памяти, то используем конструкцию push/pop, иначе копируем командой mov. После использования макроса в eax количество переданных параметров. Теперь удобно заполнять массив значениями: Код (Text): FillArray Array,100h,eax,ecx,edx,esi,edi,ebx,[Value],8,9