【问题标题】:How do I go about Power and Square root functions in Assembly(IA32)?如何处理 Assembly(IA32) 中的幂函数和平方根函数?
【发布时间】:2010-08-25 05:44:27
【问题描述】:

如何处理幂函数和平方根函数 Linux 上的汇编语言(有/无)堆栈。

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

【问题讨论】:

  • 您想避免使用数学协处理器指令吗?
  • 我是初学者,所以我也很想知道是否可以在 C 中使用一些指令,例如 math.h。
  • 您绝对可以从您的汇编代码中调用外部函数——或者您是否要求这些例程的汇编实现?你总是可以用 C 语言编写它,然后看看编译器会产生什么。
  • @Carl,你能帮我复制粘贴一个示例程序吗?

标签: linux assembly intel x86


【解决方案1】:

在 x86 汇编中,没有关于幂运算的指令,但您可以构建自己的例程,通过用对数表示幂来计算 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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我反汇编了目标代码,但是看不懂。这是一个巨大的代码,我是编程新手,所以你能给我一个更简单的解决方案吗?
    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多