Есть примерно такой код: Код (Text): ... hDv dd 8 dup (0) ;масив для хендлов в дереве ... mov esi,0 mov ebx,0 nach: mov ebx, hDv[esi] .if ebx==0 ...;здесь добавляем item в дерево... mov hDv[esi], eax ;...и заносим хендл в масив ... jmp go .else inc esi jmp nach .endif go: В двух словах: По клику добавляется item в дерево и хендл созданого айтима заносим в масив (в hDv[esi]). Если добавляем еще, то смотрим занято ли место в hDv[0], если да, то листаем до hDv[1] (в листинге inc esi) и заносим сюда. Проблема в том, что индексы массива почемуто считаются не +1 а +3!!! То есть первый хендл записывается в hDv[0], второй в hDv[3], третий в hDv[6] и т.д. Толи hDv[1] уже чемто занят, толи я незнаю каких то тонкостей...В чем дело не подскажите? Отвечу на все уточняющие вопросы.
Не сказать, что уловил, что происходит, но отмечу, что т.к. размер handle == четыре байта, то надо умножать значение индекса на четыре: 'mov hDv[esi * 4], eax' и читать таким же образом.
Та вроде нет. Массив создан как DWORD (hDv dd 8 dup (0)) то есть на каждый индекс массива припадает как раз 4 байта. Или я теперь неуловил? Я специально ввел проверку индекса таким образом: Код (Text): mov edx,esi add dl,30h mov mas,dl invoke SetWindowText,hKor,addr mas этот код разместил перед занесением хендла в массив, так вот он как раз и показывает что индекс с какого то перепугу на 3 добавляется ,а не на 1...
Это же не Си. От того, что ты объявил массив DWORD - ассемблеру не жарко не холодно - в командах надо индексы умножать на 4 или макросы использовать. Такова плата за низкоуровневое программирование.
Кстати да! Поменял место inc esi - add esi,4 и заработало так как надо (почти). Правда вылезла одна менее существенная проблемка - почему то добавляется 9 элементов, а не 8 (hDv dd 8 dup (0)). Конечно исправить это нет проблем, но хотелось бы понять логику. Не подскажите почему не 8, а 9 добавляется вопреки 8 обьявленным элементам массива?
ты уж определись или у тебя в ESI относительное смещение и тогда ты пишешь mov array[ESI],EAX ... add ESI,4 или индекс но тогда mov array[ESI*4],EAX ... inc esi
Я понял о чем вы. Но все таки моя проблема остается. Я обращаюсь к регистру как индексу (ваш второй вариант). Но в последнем элементе массива что то не то!!! Размещу весь код - может поможет: Код (Text): mov esi,0 mov ebx,0 nach: mov ebx, hDv[esi*4] .if ebx==0 ;нижние 4 строчки проверка значения в индексе esi mov edx,esi add dl,30h mov mas,dl invoke SetWindowText,hKor,addr mas ;добавляем єлемент в дерево mov eax,hParent2 mov tvinsert.hParent,eax mov tvinsert.hInsertAfter,TVI_LAST mov tvinsert.item.imask,TVIF_TEXT mov tvinsert.item.pszText,offset dv1 invoke SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert ;заносим хендл в массив mov hDv[esi*4], eax invoke SendMessage,hwndTreeView,TVM_EXPAND, TVE_EXPAND,hParent2 jmp go .else inc esi jmp nach .endif go: Так вот когда я добавляю элементы, индекс правильно показывает(1,2,3...) до последнего элемента (поидее он должен быть восьмой, но он по факту девятый) но там буква "у" почему то! Убрать бы эту последнюю гадость и все заработало бы так как нужно (то есть добавлялось бы 8 элементов). Но как ее убрать? В чем тут проблема?
Все, кажись догнал. Во всяком случае заработало правильно. Добавил в конце проверку : Код (Text): .if esi<8 jmp nach .else jmp go .endif И все работает. Не знаю насколько это правильно с точки зрения "корректного кода"... разберусь со временем.
возьмите в руки отладчик и посмотрите esi должен пробегать значения 0,1,2,3,4,5,6,7 то есть после 7 вы должны выйти из цикла для esi =8 ничего выполнятся не должно