· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Массив структур

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


Дата: Июл 24, 2003 18:22:17 · Поправил: KiNDeR

Есть структуры
LACTCH struc
 lDay   dw ?
 lMonth dw ?
 lYear  dw ?
LACTCH ends
SOTRUDNIK struc
 bFIO db 30 dup(?)
 wSTAWKA dw ?
 lch LACTCH <>
SOTRUDNIK ends

создаем массив
sname SOTRUDNIK 10 dup(<>)

Вопрос: Как, обратиться к i`му элементу массива?


Дата: Июл 24, 2003 18:29:59

KiNDeR
Да как угодно

mov   eax,offset sname

mov   ecx,(SOTRUDNIK ptr [eax+i*size(SOTRUDNIK)]).член структуры

Это MASM



Дата: Июл 24, 2003 18:32:35

KiNDeR
Скажите а по логике разве это чем то отличается от обращения к массиву dd например? Тоже самое..


Дата: Июл 24, 2003 22:20:22

mov eax,OFFSET [sname + i*38]
ASSUME eax:PTR SOTRUDNIK
mov cx,[eax].wSTAWKA
mov [eax].wSTAWKA,dx
ASSUME eax:NOTHING


Дата: Июл 24, 2003 23:19:40

наверно я сделаю так:
 mov ebx,I
 mov ax,[sname+ebx*38].wSTAWKA
 mov esi, offset s_name
 mov edi,offset [sname+ebx*38].bFIO
 mov ecx,length(s_name)
 rep movsb


Edmond, Quantum благодарю вас.
З.Ы. Оказывается, когда немного подумаешь, не так уж все и сложно... :)


Дата: Июл 24, 2003 23:21:34

А как на счет что нибудь с SSE написать????? Просто интересно!!!


Дата: Июл 25, 2003 03:44:37 · Поправил: KiNDeR

[Удалено]


Дата: Июл 26, 2003 19:40:56 · Поправил: Four-F

mov ecx,(SOTRUDNIK ptr [eax+i*size(SOTRUDNIK)]).член структуры
Не будет такое работать.
i*XXX - нельзя.
size(SOTRUDNIK) - только если он равен 1, 2, 4 или 8.

mov eax,OFFSET [sname + i*38]
Тоже не будет работать, по тем же причинам.

mov ax,[sname+ebx*38].wSTAWKA
Сработает только если вместо 38 будет 1, 2, 4 или 8.


[ KiNDeR: Как, обратиться к i`му элементу массива? ]

В данном случае простого и универсального решения, IMHO, нет.
В любом случае, придется пихать смещения в регистры и манипулировать ими, в зависимости от размеров членов структур.


Дата: Июл 26, 2003 20:42:07

mov eax,OFFSET [sname + i*38]
Тоже не будет работать, по тем же причинам.

А кто сказал что i является reg32/mem32? i*38 нужно заменить на 0,38,76 и т.д.


Дата: Июл 27, 2003 08:16:52 · Поправил: KiNDeR

Я это уже все испробывал, ни.... не работает, пришлось изобретать велосипед. Для работы со строками один способ, для работы с элементами структуры размером в слово/двойное слово - другой.

наиболее универсальный способ это:
    mov edi,offset sname.wSTAVKA
    mov eax, size SOTRUDNIK
    mov ebx,I      ; элемент массива
    mul ebx
    add edi,eax
    mov ecx,[edi]


Дата: Июл 27, 2003 23:37:49

Насколько я понимаю размер массива заранее не известен?
Если так то нужно хранить адрес начала памяти выделенной процедурой типа GlobalAlloc адрес начала последней структуры которую можно будет записать в выделенную область, и адрес следующей после последней записанной структуры.
В любом случае представлять всё это дело проще в TreeView и ListView.
В TreeView например подразделения предприятия (насколько я понял прога должна вести, что то типа своей базы данных по сотрудникам)
В ListView все сотрудники выделенного в TreeView подразделения, тогда в качестве параметра lParam передаваемого ListView в структуре LVI можно передавать адрес памяти структуры соответствующего сотрудника. При щелчке на интересующем сотруднике легко и просто получаем доступ к информации о леньтяе/стахановце.
Так же в структуре можно предусмотреть четырёх байтовое поле под хендл соответствующего итема TreeView, тогда поиск нужно будет проводить не по строкам с названием подразделения, а по хендлу соответствующего итема в TreeView.


Дата: Июл 28, 2003 06:04:46

pas
Насколько я понимаю размер массива заранее не известен?
Вообще да. Но можно сделать фиксированную длинну скажем 10 элементов.
А где нибудь на реализацию этого метода можно взглянуть?
Интересный подход.


Дата: Июл 28, 2003 09:52:15

KiNDeR
В исходниках программа каталогизатор CD Она вроде с главной страницы видна, а так в разделе утилиты кажется.
Если понадобится объяснение пиши.


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