Основные инструкции FPU/обзор стека?

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

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

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

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

fld x
fld y
fmul st, st(1)

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

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

or:

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

?

Обратите внимание, что разница между ними — это значение в ST(1).


person ProdigySim    schedule 20.07.2011    source источник


Ответы (2)


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

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

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

person Igor Skochinsky    schedule 20.07.2011
comment
Спасибо! Ссылка тоже очень помогла. - person ProdigySim; 20.07.2011

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

person Necrolis    schedule 20.07.2011
comment
@ProdigySim: вы найдете их здесь: intel.com/products/processor/manuals - person Necrolis; 21.07.2011