Масм, непонятки

Тема в разделе "WASM.BEGINNERS", создана пользователем driver, 24 июл 2008.

  1. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    1. Array dd 48 dup(a1,......a48)
    Обнаружилось, что 48 - предельное число элементов в массиве. Это какое-то фундаментальное ограничение? Нужно 50 элементов и никак не могу сделать...:dntknw:

    2. mov eax,[Array + 4*ebx] - при замене ebx на какой-либо другой регистр не работает. Так ДОЛЖНО быть?

    3. mov ebx, (bool)

    .REPEAT

    ;что-то делаем, используя ebx

    .UNTIL ebx==0

    НЕ работает. Если использовать переменную вместо регистра - всё нормально... Цикл ( сканирование картинки) длится от 0,1 сек и больше, в зависимости от её размеров... Получается - при переключении потоков система не всегда может восстановить значение регистров? ( например, когда цикл выполнялся и в этот момент произошло переключение...) Может нужно указать конкретно, что used ebx?
     
  2. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Array dd 1, 2, 3, 4, 5, .... стомильонаф


    Я не телепат, нокаково значение другого регистра перед использованием данной команды?

    Такое ощущение, что отладчик создан не для тебя.
    Если ты используешь ebx и перебиваешь его значение, как оно должно работать то??
    При чем тут переключение потоков?

    Код в студию короче. А не куски.
     
  3. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    попробуй так
    Array dd a1,......a48
    dd a49,.....a100
    ;и так далее

    ebx лучше воабще не трогать если вызовы API происходят в цикле. можно использовать esi или edi и после дерективы proc указать uses esi(или edi)
     
  4. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    что-то новое. Сам сишный компилер внутри своих функций часто юзает ebx, а на выходе из функи восстанавливает.
     
  5. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    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
     
  6. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    .UNTIL var==0
     
  7. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    .UNTIL var==0
    ...........
    действительно это работает вся заморочка началась, когда сканировал от верхнего левого угла...сори подзабыл уже, а сравнивать пытался
    var== var2 ; var2 - размер
    тут точно облом...

    Но суть остаётся прежней - " Винда при переключении потоков Не может в некотрых случаях сохранить значение регистров, используемых программой ".

    забыл где читал " Хотя регистры ..., ..., и т.д называют регистрами общего пользования, на самом деле это не так. Система не предпологает по дефолту, что какие-либо регистры будут использоваться приложениями.."
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    driver
    не может быть!
    читай айсцзелеона по каллинг ковенци
    значения твои затираются только вызовами функций
     
  9. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Приведи код в студию.
    Если бы не сохранялись регистры при переключении потоков, - работа в виндовс как в многозадачной среде была бы невозможна в ПРИНЦИПЕ!
     
  10. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    Код (Text):
    1. 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 карты, вот в чём проблема :dntknw:

    а если написать

    Array dd a1,......a26
    dd a27,.....a52

    - ebx меняем от 0 до 51, а элементы извлекаются только из первой строчки, почему-то... попробую ещё чегонить ...

    ???

    Вот ещё проблема, для начинающего : предположим есть несколько массивов Array1, Array2, и т.д. Выбираются случайным образом, как к ним обращаться?

    mov eax, [Array(#) +4*ebx]

    склеивать Array и # и убрать завершающий 0 как-то?
     
  11. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    как они могу извлекаться только из первой строчки?

    быть такого не может.

    mov ebx, 51
    mov eax, [Array+4*ebx]
    Все извлекается верно.


    Array1 dd .....
    Array2 dd .....

    Тебе нужно знать размер первого массива.

    размер первого массива сохраняешь в переменную
    Код (Text):
    1. mov [array1_size], (offset Array2 - offset Array1)
    Тогда


    Код (Text):
    1. rdtsc
    2. and eax, 1                                 ;получаешь случайно либо 1 либо 0
    3. mov esi, [array1_size]
    4. imul eax, eax, esi                        ;в еах смещение (либо первый массив, либо второй)
    5.  
    6. mov eax, [Array1 +4*ebx+eax]      ;получаешь элемент с индексом ebx из заданного массива
     
  12. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    Magnum пасиба , попробую ...