如何在Assembly(IA32)中查看Power和Square根函数?

时间:2010-08-25 05:44:27

标签: linux assembly intel x86

如何进入Power和Square root函数 汇编语言(带/出)在Linux上堆栈。

编辑1:我正在为 Intel x_86 进行编程。

2 个答案:

答案 0 :(得分:3)

在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 :(得分:1)

编写一个简单的几行C程序来执行您感兴趣的任务。将其编译为一个对象。反汇编该对象....看看汇编程序如何准备调用数学函数以及它如何调用数学函数,将反汇编的代码段作为汇编程序的起点并从那里开始。

现在,如果您正在谈论没有操作系统的嵌入式系统,问题不是操作系统而是C /数学库。在这些函数或其他函数中,这些库可能依赖于无效的操作系统调用。理想情况下,虽然它是相同的机制,但通过设置正确的寄存器来准备函数调用,调用函数,使用结果。嵌入式中,当您尝试将代码与库链接和/或尝试执行时,问题就出现了。

如果您在不使用使用离散指令的预制库的情况下询问如何重新创建此功能。这是一个完全不同的主题,特别是如果你使用没有这些指令的处理器。您可以通过查看这些函数库的源代码和/或有问题的函数的反汇编来了解一点,但这可能并不明显。寻找类似于“Hacker's Delight”的书或书,其中包含了许多类似于执行语言或处理器本身不支持的数学函数的内容。