Как мне узнать о функциях Power и Square root в Assembly (IA32)? - PullRequest
1 голос
/ 25 августа 2010

Как работать с функциями Power и Square root на языке ассемблера (с / без) Стек в Linux.

Редактировать 1: Я программирую для Intel x_86.

Ответы [ 2 ]

3 голосов
/ 30 августа 2010

В сборке x86 нет инструкции для операции Power, но вы можете создать свою собственную подпрограмму для вычисления Power (), выражая Power в виде логарифмов.

Следующие две инструкции вычисляют логарифмы:

FYL2X   ; Replace ST(1) with (ST(1) * log2 ST(0)) and pop the register stack.
FYL2XP1 ; Replace ST(1) with (ST(1) * log2(ST(0) + 1.0)) and pop the register stack.

Существует несколько способов вычисления квадратного корня:

(1) Вы можете использовать инструкцию FPU

FSQRT ; Computes square root of ST(0) and stores the result in ST(0).

(2), или вы можетеиспользуйте следующие инструкции SSE / SSE2:

SQRTPD xmm1, xmm2/m128 ;Compute Square Roots of Packed Double-Precision Floating-Point Values
SQRTPS xmm1, xmm2/m128 ;Compute Square Roots of Packed Single-Precision Floating-Point Values
SQRTSS xmm1, xmm2/m128 ;Compute Square Root of Scalar Single-Precision Floating-Point Value
SQRTSD xmm1, xmm2/m128 ;Compute Square Root of Scalar Double-Precision Floating-Point Value
1 голос
/ 25 августа 2010

Напишите простую программу из нескольких строк C, которая выполняет интересующую вас задачу. Скомпилируйте ее для объекта. Разберите этот объект .... Посмотрите, как ассемблер готовится вызвать математическую функцию и как она вызывает математическую функцию, возьмите сегменты дизассемблированного кода в качестве отправной точки для ассемблера и перейдите оттуда.

Теперь, если вы говорите о какой-то встроенной системе без операционной системы, проблема не в операционной системе, а в библиотеке C / math. Эти библиотеки в этих или других функциях могут полагаться на вызовы операционной системы, которые не будут действительными. В идеале, хотя это тот же самый точный механизм, подготовьтесь к вызову функции, установив правильные регистры, сделайте вызов функции, используйте результаты. С внедренным ваша проблема возникает, когда вы пытаетесь связать свой код с библиотекой и / или когда вы пытаетесь выполнить его.

Если вы спрашиваете, как воссоздать эту функцию без использования предварительно созданной библиотеки с использованием дискретных инструкций. Это совершенно другая тема, особенно если вы используете процессор без этих инструкций. Вы можете немного узнать, посмотрев исходный код библиотеки для этих функций и / или разборку рассматриваемых функций, но это, вероятно, не очевидно. Ищите книгу или книгу, похожую на «Восторг хакера», в которой полно таких вещей, как выполнение математических функций, которые изначально не поддерживаются языком или процессором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...