Основные инструкции FPU / обзор стека? - PullRequest
3 голосов
/ 20 июля 2011

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

В принципе, адресация регистров fpu смущает меня.Если я ссылаюсь на st (#), я говорю о конкретном регистре?Или это смещение от вершины стека?

Я думаю, что на большинство моих вопросов можно ответить одним примером:

Если у меня пустой стек FPU, и запустите:

fld x
fld y
fmul st, st(1)

Будет ли результат:

ST(0) = y * x
ST(1) = x

или:

ST(0) = x * y
ST(1) = y

?

Обратите внимание, что разница между ними составляет значение вСТ (1).

Ответы [ 2 ]

5 голосов
/ 20 июля 2011

Это смещение сверху.Нагрузки выталкивают существующие предметы дальше в стек, а хлопки заставляют их двигаться ближе к вершине.Вот как будет выглядеть ваша маленькая программа:

                   ST(0)      ST(1)
<start>            ---         ---
fld x               x          ---
fld y               y           x
fmul st(0), st(1)  y*x          x

Эта ссылка объясняет все это очень хорошо.

1 голос
/ 20 июля 2011

Руководства Intel для разработчиков - это лучшее место, где можно узнать, как работает конкретная инструкция для fpu (и как работает сама fpu).В вашем примере, сначала загружается x, помещая его в st (0), когда вы загружаете y, st (0) опускается до st (1), а y помещается в st (0).Когда вы fmul, st (0) становится y * x, st (1) остается x.В основном это стек FILO (с переворотом и некоторыми другими специальными функциями)

...