запись в занятый регистр FPU - почему нет?

Тема в разделе "WASM.ASSEMBLER", создана пользователем dGen, 10 янв 2012.

  1. dGen

    dGen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2012
    Сообщения:
    6
    Несколько странный вопрос у меня: зачем сделано так, что если все 8 регистров мат. сопроцессора заняты, то без явного их (или хотя бы одного) опустошения ничего записать нельзя. Что такого ужасного может случиться, если взять да и записать новое число поверх старого?
     
  2. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Вроде к FPU регистрам вообще напрямую не обращаются, только через стек.
     
  3. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    dGen
    Это с чего вы такую ересь взяли ?
     
  4. dGen

    dGen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2012
    Сообщения:
    6
    Почему ересь?
    Попробуйте выполнить
    FINIT
    FLD var
    FLD var
    FLD var
    FLD var
    FLD var
    FLD var
    FLD var
    FLD var
    FLD var
    FST v
    В результате в v будет какая-то чушь,

    Ну да, это подразумевалось.
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    dGen, есть и другие способы получить доступ к регистрам FPU, вот например:
    1) через FSAVE/FRSTOR
    Команда FSAVE DEST (FPU SAVE State) считывает в ячейку DEST (m94byte, если use16 либо m108byte, если use32) в системной памяти данные из FPU целиком, включая R0-R7, и выполняет FINIT. За первыми 14/28 байтами окружения следуют копии R0-R7.
    Команда FRSTOR SRC (FPU RESTORE State) восстанавливает состояние FPU полностью, в соответствии с образом из ячейки SRC (m94byte, если use16 либо m108byte, если use32) в системной памяти
    2) MMX-команды используют восемь 64-разрядных регистров. К регистрам обеспечивается прямой доступ по именам: MM0..MM7. Физически регистры MMX размещены в мантиссах регистров FPU (биты 0-63). Таким образом, при записи любого значения в MMX-регистр это значение попадает в один из регистров FPU.
     
  6. dGen

    dGen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2012
    Сообщения:
    6
    Это всё здорово, но вопрос-таки в том, какова была логика инженеров, запретивших запись в занятый регистр
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    а я-то подумал, что вопрос
    и я показал, как это обойти, а вот какова была логика инженеров создавших intel 8087 в 1978 я объяснить не смогу...
     
  8. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    dGen
    Логика тех же инженеров использовалась в механизмах защиты памяти. Обращение к не выделенной памяти приводит к #PF. Аналогично и с NPX стеком(если доставка фолтов разрешена). Вы должны знать какую среду юзаете, память, регистры етц. Обращение к не своей среде это нарушение защиты и оно пресекается.
     
  9. dGen

    dGen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2012
    Сообщения:
    6
    #PF? Что это? Гугл не помог, к сожалению.
    И если для защиты памяти - получается, не только ЦПУ может командовать сопроцессору записывать данные в свои регистры? Я так понимаю - мы написали в программе команду, подразумевающую запись так или иначе - он записывает, и ни в каких других случаях, от кого защищать-то?
     
  10. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    dGen
    Пока вы не удосужились ознакомиться с матчасть, не стоит и пытаться кодить NPX. Пока пусть за вас это делает компилятор.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    dGen
    Запрещена не "запись в занятый регистр", а переполнение стека FPU, что вполне логично, т.к. иначе это был бы не стек, а кольцевой буфер и помечать регистры как свободные\занятые не было бы вообще никакого смысла. Но тогда нелюбители подчищать за собой стек не задавали бы "несколько странные" вопросы, а бились бы головой апстену в поисках "неуловимых мстителей" - ошибок переполнения ;)
     
  12. dGen

    dGen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2012
    Сообщения:
    6
    Ну, вообще там и есть т.н. кольцевой стек, почему бы не перезаписывать уже хранящееся там число?
     
  13. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Имхо, вопрос из разряда «почему в эритроцитах активное вещество железо, а не медь».
    У каждого из этих подходов (запрет переполнения, либо перезапись) есть свои достоинства и недостатки.
    Особенность архитектуры.
     
  14. dGen

    dGen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2012
    Сообщения:
    6
    Полностью согласен, но вот мой преподаватель так не думает :)
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    dGen
    Так leo уже и дал ответ: чтобы спасти программистов от их кривых рук. Кольцевой буфер с переполнением никому не нужен. В связи со спецификой вычислений значений выражений (выражения в польской записи) нужен бесконечный стек. Очевидно, что бесконечный сделать невозможно, но зато возможно сделать конечный и в случае чего бить по рукам.
     
  16. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Мертвому припарка. Вычисление выражений с плавающей точкой - самое последнее место, где накосячат кривые руки, особенно если на ЯВУ. Если уж думали о кривых руках - то лучше б аппаратную поддержку указателей продумали (типа явного обозначения того, что содержимое является указателем, поддержка референс каунтинга и проч).

    Скорее всего просто идеология - стек, так уж стек (ибо имеенно он нужен для вычисления выражений в обще м случае), и если он заполнится - значит заполнился.
     
  17. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    l_inc
    Так оно и работает. Нужно разрешить бить по рукам - размаскировать бит IM в CW(fldcw/fldenv), тогда будет удар по рукам в виде #IS при попытке переполнить стек. Причём для доставки результата на процессор следует использовать инструкцию fwait. Вполне грамотно реализовали.
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Malfoy
    Спасибо, интересное решение! Применю...
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Dmitry_Milk
    Причём здесь вообще ЯВУ, если речь о низкоуровневой архитектуре? Указатели — последнее место, где накосячат кривые руки, особенно если чинить унитазы. А вот попробуйте написать компилятор формул произвольной сложности (для того же ЯВУ), увидите, что очень легко забыть про конечность стека.
    Об этом и речь.
    Об этом и речь.
    Malfoy
    Об этом и речь.
    Об этом и речь.
     
  20. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    l_inc
    Спасибо за пост со смыслом :lol: