· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› массивы в одной структуре!!!

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Окт 14, 2003 00:46:23

Как сделать чтобы массивы находились в одной структуре!
допустим:
mas1 dd 1
dd 2
dd 3
dd 4

mas2 dd 10
dd 11
dd 12
dd 13

Как все это увязать в структуру, чтобы записывать по 8 байт изначения распределялись бы равномерно по 4 байта в каждый массив... :-)))


Дата: Окт 14, 2003 01:00:58

А где там 8 байт? Я вижу 16 байт в одном массиве и 16 в другом.

чтобы записывать по 8 байт изначения распределялись бы равномерно
Приведи пример подобной записи. Суть задачи не ясна. При чём здесь структуры?
mas1 dd 4 dup (0)
mas2 dd 4 dup (0)
При записи 32 байт в mas1, последние 16 окажутся в mas2. В чём собственно проблема?


Дата: Окт 14, 2003 01:05:36

Quantum
Задумка в том чтобы массивы распологались в структуре
mas1
mas2
и если бы мы записывали числа 1,2,3,4,5,6,7,8,9,10 по 4 байта
то они бы расположились вот так
mas1:1,3,5,7,9
mas2:2,4,6,8,10


Дата: Окт 14, 2003 06:43:42 · Поправил: Quantum

emergenter
Так их можно записать в изначальном порядке:
mas1 dd 1
mas2 dd 2,3,4,5,6,7,8,9,10

Потом для доступа к элементам из mas1:
mov DWORD PTR [mas1 + 8 * i],val ; <- Записываем val в
                                      ; ячейку i из mas1
mov DWORD PTR [mas2 + 8 * i],val ; <- Записываем val в
                                      ; ячейку i из mas2
Для чтения, массивы индексируются аналогичным образом. Ещё можно написать макрос.


Дата: Окт 14, 2003 13:42:24

Quantum
Дело в том когда делаешь внешнюю процедуру и подаешь туда только укзатели на первые элементы... то я думаю есть смысл задуматься об оптимальном копировании


Дата: Окт 20, 2003 18:17:31

Подскажите пожалуйста как можно динамичесик выделять и освобождать память , например, по массив.
Спасибо.


Дата: Окт 20, 2003 18:21:42

Gromozeka,
VirtalAlloc/VirtualFree, MMF, Heap-функции, etc.


Дата: Окт 20, 2003 19:16:55

Gromozeka
Выбор предложенных masquer'ом функций
зависит от необходимого объёма памяти. Ещё можно предложить стек для выделения небольших блоков памяти (пару Кб).


Дата: Окт 20, 2003 20:10:04 · Поправил: Gromozeka

Спасибо за ответы. Способ предложенный Quantum'ом мне не подходит, потому что с элементами данного массива мне прийдеться еще вычисления проводить, а извлекать и помещать в стек все время не целезообразно.
Вы бы не могли подсказать где об этом можно почитать, потому что в Рудакове и Феногенове, Сване и Юрове я этого не нашел.
Спасибо за помощь.


Дата: Окт 20, 2003 21:11:37 · Поправил: Quantum

Gromozeka
а извлекать и помещать в стек все время не целезообразно.
Так и незачем извлекать и помещать. Вы каким ассемблером пользуетесь? Если масмом, то
myProc PROC
   LOCAL dynamic[1024]:BYTE
   ; В dynamic теперь 1К динамической памяти
   ; и доступ к ней можно осуществлять напрямую
   ret
   ; А здесь dynamic уже умер.
myProc ENDP


Дата: Окт 20, 2003 21:14:01

Вы бы не могли подсказать где об этом можно почитать
На сайте лежат статьи Edmond'а про память и иже с ней.


Дата: Окт 21, 2003 17:34:31

Я пользуюсь TASM'ом. Статьи Edmond'a я нашел(1,3 и 4-ую), а 2-ой там нет.


Дата: Окт 21, 2003 21:06:22

Gromozeka
В тасме, наверное, можно так:
sub esp,1024 ; <- выделили 1К памяти в стеке
add esp,1024 ; <- удалили эту память
А про HeapAlloc вы уже почитали?


Дата: Ноя 1, 2003 00:30:45
Правка

myProc PROC
LOCAL dynamic[1024]:BYTE
; В dynamic теперь 1К динамической памяти
; и доступ к ней можно осуществлять напрямую
ret
; А здесь dynamic уже умер.
myProc ENDP

А если ret'ов несколько? Ведь часто в исходниках такое встречаешь, что вместо прыжка на конец процедуры пишут просто ret

Что тогда случится?


Дата: Ноя 1, 2003 01:54:02

IceStudent
В данном случае ret рассматривается не как команда, а как конец процедуры. Поэтому если в процедуре встречается несколько ret'ов, то dynamic "умрет" только после выполнения одной из этих комманд, т.е. после выхода из процедуры.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.108