1. Array dd 48 dup(a1,......a48) Обнаружилось, что 48 - предельное число элементов в массиве. Это какое-то фундаментальное ограничение? Нужно 50 элементов и никак не могу сделать... 2. mov eax,[Array + 4*ebx] - при замене ebx на какой-либо другой регистр не работает. Так ДОЛЖНО быть? 3. mov ebx, (bool) .REPEAT ;что-то делаем, используя ebx .UNTIL ebx==0 НЕ работает. Если использовать переменную вместо регистра - всё нормально... Цикл ( сканирование картинки) длится от 0,1 сек и больше, в зависимости от её размеров... Получается - при переключении потоков система не всегда может восстановить значение регистров? ( например, когда цикл выполнялся и в этот момент произошло переключение...) Может нужно указать конкретно, что used ebx?
Array dd 1, 2, 3, 4, 5, .... стомильонаф Я не телепат, нокаково значение другого регистра перед использованием данной команды? Такое ощущение, что отладчик создан не для тебя. Если ты используешь ebx и перебиваешь его значение, как оно должно работать то?? При чем тут переключение потоков? Код в студию короче. А не куски.
попробуй так Array dd a1,......a48 dd a49,.....a100 ;и так далее ebx лучше воабще не трогать если вызовы API происходят в цикле. можно использовать esi или edi и после дерективы proc указать uses esi(или edi)
что-то новое. Сам сишный компилер внутри своих функций часто юзает ebx, а на выходе из функи восстанавливает.
2. если например у меня в ecx - номер элемента, до которого нужно добраться, то mov eax,[Array + 4*ecx] - НЕ работает...вот я и спрашиваю - так должно быть? c ebx всё ок. Проблема - работать приходится с двумя массивами одновремённо - и неудобно использовать только ebx 3. mov ebx, (bool1) ; размер картинки по вертикали +1 mov ecx, (bool2) ; размер по горизонтали .REPEAT ;сканируем картинку, начиная с нижнего правого угла ;когда ebx станет равным 0, выходим из цикла .UNTIL ebx==0 ..................................... Пробовал с еси и еди - то же самое, не работает, а потом занял их под те самые ( bool). Регистры пытался использовать, чтобы не вводить переменные да и в конце цикла - сравнение с переменной не катит, нужен регистр и если использовать переменную - появится mov eax,var ; эта строка будет отрабатывать (число строк) раз, некрасиво... .UNTIL eax==0
.UNTIL var==0 ........... действительно это работает вся заморочка началась, когда сканировал от верхнего левого угла...сори подзабыл уже, а сравнивать пытался var== var2 ; var2 - размер тут точно облом... Но суть остаётся прежней - " Винда при переключении потоков Не может в некотрых случаях сохранить значение регистров, используемых программой ". забыл где читал " Хотя регистры ..., ..., и т.д называют регистрами общего пользования, на самом деле это не так. Система не предпологает по дефолту, что какие-либо регистры будут использоваться приложениями.."
driver не может быть! читай айсцзелеона по каллинг ковенци значения твои затираются только вызовами функций
Приведи код в студию. Если бы не сохранялись регистры при переключении потоков, - работа в виндовс как в многозадачной среде была бы невозможна в ПРИНЦИПЕ!
Код (Text): Array dd 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 Методом последовательных приближений ( блин ) удалось установить - при числе элементов =48 всё ок, начиная с 49 выдаёт ошибку : error A2042 statment too complex Что делать? В колоде 52 карты, вот в чём проблема а если написать Array dd a1,......a26 dd a27,.....a52 - ebx меняем от 0 до 51, а элементы извлекаются только из первой строчки, почему-то... попробую ещё чегонить ... ??? Вот ещё проблема, для начинающего : предположим есть несколько массивов Array1, Array2, и т.д. Выбираются случайным образом, как к ним обращаться? mov eax, [Array(#) +4*ebx] склеивать Array и # и убрать завершающий 0 как-то?
как они могу извлекаться только из первой строчки? быть такого не может. mov ebx, 51 mov eax, [Array+4*ebx] Все извлекается верно. Array1 dd ..... Array2 dd ..... Тебе нужно знать размер первого массива. размер первого массива сохраняешь в переменную Код (Text): mov [array1_size], (offset Array2 - offset Array1) Тогда Код (Text): rdtsc and eax, 1 ;получаешь случайно либо 1 либо 0 mov esi, [array1_size] imul eax, eax, esi ;в еах смещение (либо первый массив, либо второй) mov eax, [Array1 +4*ebx+eax] ;получаешь элемент с индексом ebx из заданного массива