На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Кол-во регистровых переменных , в 32bit-ных регистрах
    Только не смейтесь, но я вообще не знаю что такое регистры, где они находятся и всё такое :) .

    Ну так вот, регистровые переменные работают гораздо быстрее чем авто, это я знаю. Но мне интересно сколько переменных может находится в регистрах проца, в частности 32bit-ных. Вообще в моём понятии сколько регистров столько и переменных, или как?
      чтобы понять, что такое регистры, тебе надо познакомиться с ассемблером. регистров не так уж и много, и не все они используются для хранения переменных. кроме того, регистр еще состоит из частей. например, в 16 разрядном ассемблере регистр AX имеет две части AH и AL (по 8 бит каждая).
      а вот сколько переменных можно хранить в регистре - это зависит от того, насколько у тебя развита фантазия. например в 8 разрядной части регистра можно хранить 8 бит. а 8 бит - это
      1. одна переменная (0.256 или -127..128)
      2. набор битов (8 бит, значит 8 флагов - уже восемь переменных)
      3. какой то адрес (указатель грубо говоря).

      ну и так далее по списку.
        А про 32 разрядный ассемблер и егошние регистры (исли такие существуют, но вроде где-то попадались) ничего неизвесно?
          Цитата
          Bilbo Bagins, 13.02.04, 00:11
          А про 32 разрядный ассемблер и егошние регистры (исли такие существуют, но вроде где-то попадались) ничего неизвесно?


          Скачай Интеловский Command Reference - там есть
            Цитата
            Bilbo Bagins, 12.02.04, 18:48
            Но мне интересно сколько переменных может находится в регистрах проца, в частности 32bit-ных
            Для Intel IA-32 в лучшем случае 7(регистры ax,bx,cx,dx,si,di,bp), реально не более 3-4.

            Добавлено в :
            Цитата
            Bilbo Bagins, 12.02.04, 18:48
            Вообще в моём понятии сколько регистров столько и переменных, или как?
            Не совсем. Регистры нужны также для внутренних нужд. Например, для выполнения функции memcpy нужны три регистра. (E)BP может использоваться для адресации локальных переменных. и т.д.
            Сообщение отредактировано: trainer -
              2 Bilbo: посмотри здесь: http://www.intel.com/technology/itj/q12001...icles/art_2.htm


              Цитата trainer @ 13.02.04, 05:23
              Для Intel IA-32 в лучшем случае 7(регистры ax,bx,cx,dx,si,di,bp), реально не более 3-4.


              Ну если IA-32, то почему у вас регистры 16-разрядные?
              Тогда уж eax, ebx и т.д.

              Кроме того, не стоит забывать про такую фичу как register renaming
              Цитата

              The register renaming logic renames the logical IA-32 registers such as EAX onto the processors 128-entry physical register file. This allows the small, 8-entry, architecturally defined IA-32 register file to be dynamically expanded to use the 128 physical registers in the Pentium 4 processor. This renaming process removes false conflicts caused by multiple instructions creating their simultaneous but unique versions of a register such as EAX.


              Читать про это по вышеуказанному линку, стр.5

              Реально, при написании кода, вы не можете непосредственно использовать весь регистровый файл. Зато многие современные компиляторы умеют пользоваться преимуществами целевой архитектуры.

              +

              И еще замечание. В одном регистре может находиться несколько "переменных".
              Возьмем к примеру 16 разрядный регистр ax.
              В верхней части (ah) мы можем сохранить одно 8 разрадное значение, а в нижней (al) другое.

              Только все равно, для современных ПК это в большинстве случаев пустая трата времени. Сам когда-то на асме писал, знаю. Для микропроцессоров еще может и будет польза, там ресурсов мало. А для обычного приложения под Wintel даже и не стоит заморачиваться. Компиляторы генерируют практически оптимальный код. Что-то в нем улучшить сложно. Только если сделать что-то нестандартное...
              Сообщение отредактировано: god -
                Цитата
                god, 13.02.04, 13:22
                Ну если IA-32, то почему у вас регистры 16-разрядные?
                Потому, что у него есть 16-разряднйы режим. ;) Кроме того, по официальной информации, к IA-32 относятся и 16-разрядные 8086/8088/80186/80188/80286.

                Переименование происходит внутри процессора при т.н. "спекулятивном исполнении" начиная с пентиума и программно недоступно.
                Сообщение отредактировано: trainer -
                  Цитата trainer @ 13.02.04, 10:53
                  Потому, что у него есть 16-разряднйы режим. ;)

                  ;)
                  Цитата trainer @ 13.02.04, 10:53
                  Переименование происходит внутри процессора при т.н. "спекулятивном исполнении" и программно недоступно.


                  Офкос. Просто если мы говорим о таком способе "ускорить" программу, как использование регистров (что компилятор и так делает весьма виртуозно), то нужно упомянуть и о том, что кол-во регистров доступных программисту и реальное кол-во ячеек памяти под эти самые регистры могут отличаться.

                  Оффтоп: Я вот от HT радуюсь. Думал это просто рекламная фишка, ан нет... С включенным HT виснут (deadlock) программы с кривой межпоточной синхронизацией, а без HT нет. Т.е эта технология действительно добавляет еще один, пусть и "виртуальный", процессор...

                  Добавлено в :
                  Цитата trainer @ 13.02.04, 10:53
                  Кроме того, по официальной информации, к IA-32 относятся и 16-разрядные 8086/8088/80186/80188/80286.

                  Да, действительно("IA-32 Intel ® Architecture Software Developer’s Manual"). Я почему-то полагал, что число после IA означает разрядность процессора....
                  :blink:
                    Цитата
                    Компиляторы генерируют практически оптимальный код

                    Может у меня компиляторы старые (что маловероятно), но этот "оптимальный" код... Привожу пример - писал свою шифровалку, в итоге: не оптимизированных 31 сек/мб, добавил пару регистровых переменных - 28 сек/мб. Пробовал компилить MSVC++ и Metrowerks CodeWarrior 5, результат схож. И это еще моими неумелыми руками, но результат на лицо - чего-то добиться можно.

                    А насчет новых компиляторов - помоему они дублируют все характеристики и возможности для старых процессоров и лишь улучшают поддержку новых.

                    ЗЫ. Где-то в литературе попадалось что в 32-х битные регистры можно вместить ГОРАЗДО больше переменных чем в 16, как я понял там вообще всё без проблем?
                    Сообщение отредактировано: Bilbo Bagins -
                      Цитата
                      Bilbo Bagins, 14.02.04, 18:02
                      Где-то в литературе попадалось что в 32-х битные регистры можно вместить ГОРАЗДО больше переменных чем в 16,
                      Это как раз не так. Для ЯВУ в этом смысле 32-разрядные ничем не отличаются от 16-разрядных.
                      (E)AX - полноразмерный(16 или 32 бита) или два 8-разрядных
                      (E)BX - полноразмерный(16 или 32 бита) или два 8-разрядных
                      (E)CX - полноразмерный(16 или 32 бита) или два 8-разрядных
                      (E)DX - полноразмерный(16 или 32 бита) или два 8-разрядных
                      (E)SI - только полноразмерный
                      (E)DI - только полноразмерный
                      (E)BP - только полноразмерный
                      Итого максимум в любом случае - 3 int + 4 * ( int или 2 char)
                      По другому можно разбить только извращениями, при этом производительность упадет.
                        О, спасибо за такой хороший инф. Теперь буду знать.
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0365 ]   [ 15 queries used ]   [ Generated: 15.05.24, 06:08 GMT ]