Что делать когда нехватает регистров?

Тема в разделе "WASM.BEGINNERS", создана пользователем fluck, 7 окт 2009.

  1. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    Возникла вот такая проблема. Использовал уже все 6 32-битных регистров общего назначения (eax,ebx,edx,ecx,esi,edi). Правда есть ещё ebp, но когда я его использую возникают проблемы. Мне нужно ещё несколько регистров для хранения нескольких 32 битных переменных. Как же быть?
    можно конечно делать так:
    Но так мне кажется, что это будет не совсем эффективно. Что подскажете делать в этой ситуации?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    рефакторить код :)
    Очень редко требуется использование всех 6 регистров.
    А использование ebp обычно рушит фрейм.
     
  3. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    У тебя тяжёлая, требовательная программа?
    Если нет - пользуй переменные или стэк. Хотя, если и да, то ничего не меняется =)
    Оптимизируй алгоритмы
     
  4. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    При обращении к этим переменных их значения будут загружатся из менее скоростной памяти (ОЗУ,КЭШ) чем регистровая? Так ведь?

    Не могу. Они и так оптимизированы.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    С чего бы вдруг? Конечно нет.

    Слабо верю в это.
     
  6. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    А где тогда будут размещатся эти переменные?
    И как объявить переменную и загрузить в неё значение?
    Такой код не прокатывает:
    Код (Text):
    1. int var = 5;
    2. asm{
    3. var1 DD 0
    4. mov var1,[var]
    5. }
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    fluck
    по скорости или размеру?
    переменные необходимо объявлять в сегменте данных, или хранить в стеке.
     
  8. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Есть ещё регистры MMX и(или) стек сопроцессора, если что.
     
  9. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    По скорости

    А как лучше будет? Покажите пож-та как это делается на инлайн ASM в MSVS
     
  10. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    CyberManiac
    А ещё есть xmm и Intel AVX регистры ещё скажите
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ес-но, т.к. во-первых, никакие dd в msvc объявлять нельзя, во-вторых, инструкции mov var1,[var] в природе не существует, т.к. проц не может пересылать даные непосредственно из памяти в память (за исключением push\pop)
    Код (Text):
    1. int var = 5;
    2. int var1;
    3. asm{
    4. mov eax,var
    5. mov var1,eax
    6. }
     
  12. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    leo, это вы мне сейчас по моему показали как делается копирование значения одной переменной в другую через Ассемблер. Меня же интересует как можно создать переменную, загрузить в неё значение и потом юзать её совместно с другими регистрами, при том условии, что все 32-битные регистры уже заняты под другие переменные?
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А объявление int var - это по твоему не создание стековой переменной ?
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А как "загрузить в неё значение и потом юзать её совместно с другими регистрами", я думаю ты и сам можешь догадаться :lol:
     
  15. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    ну да это так.
    Хорошо тогда чтобы полносью мне разобратся мне нужен ответы вот на какие вопросы:
    Где физически размещаются стэковые переменные? Насколько я знаю стэк, как и куча, находятся в адресном пространстве процесса, которое физически размещено в ОЗУ + Диск. Значит стэк физически располагается в ОЗУ.

    Когда процессору нужно допустим вычислить выражение с = a + b, где a,b,c - стэковые переменные. Процессор должен загрузить переменные a,b в свои регистры. Загрузить он их должен из своего кэша. Если в кэше их нет, то он их подружает туда из ОЗУ. Если, на момент вычисления выражения с = a + b все 32 битовые регистры уже заняты, то в какие регистры и как проц загрузит переменные a и b?
    И ещё:
    Вот допустим в таком коде:
    Код (Text):
    1. int a = 5;
    2. _ASM{
    3. ..... ; здесь во все регистры общего назначения загружаются данные
    4. .....
    5. ;далее выполняется след. инструкция  много раз
    6. add add eax,[i]a[/i]
    7. }
    то при каждом обращении к переменной a проц каждый раз ведь выставляет запрос на её загрузку из кэша. На загрузку из кэша уходят лишние такты. А если бы переменная a находилась в регистре то на выполнение этих сложений потратилось бы меньше времени. Так ведь или нет?
    Поэтому я и написал в 1-ом посте, что загружать напрямую не эффективно.
     
  16. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    а если бы данные не нужно было записывать в регистры общего назначения а сразу магическим образом засаживать в регистры АЛУ
    было бы еще быстрее, "если бы да кабы"
     
  17. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    я бы советовал расслабиться и начать использовать переменные. Хотел бы я знать, что там за вычисления, для которых надо только регистры? Снятие в реальном времени данных с датчика с частотой 1 Ггц? Управление крылатой ракетой? Во всех остальных случаях имхо разница между 10 мс и 20 мс абсолютно не существенно =)
     
  18. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    нет, он для этого и нужен
     
  19. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    на загрузку в кеш из памяти такты идут
     
  20. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Неа.

    Процессор это мультипараллельное (мультискалярное) устройство. Он выполняет множество операций параллельно.
    Так и тут загрузка будет идти параллельно с расчетом. И такты не тратятся.

    Такты тратятся только в виде штрафа.

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