2010-08-25 53 views
1

如何在Linux上使用 彙編語言(帶/不帶)堆棧的功耗和平方根函數。如何在Assembly(IA32)中使用Power和Square root函數?

編輯1:我正在編程爲Intel x_86

+0

你想避免使用數學協處理器指令嗎? – 2010-08-25 05:50:39

+0

我是初學者,所以我也很想知道,如果我可以使用一些指令,如C. – Pavitar 2010-08-25 05:53:09

+0

中的math.h,您可以從程序集代碼中明確調用外部函數 - 或者您是否要求實現這些例程的程序集實現?你總是可以用C編寫它,看看編譯器提供了什麼。 – 2010-08-25 06:05:53

回答

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

編寫一個簡單的幾行C程序,執行您感興趣的任務。將其編譯爲一個對象。反彙編該對象....看看彙編程序如何準備調用數學函數以及它如何調用數學函數,將反彙編的代碼段作爲彙編程序的出發點並從那裏開始。

現在,如果您正在談論一些沒有操作系統的嵌入式系統,問題不在於操作系統,而在於C /數學庫。那些函數庫或其他函數庫可能依賴於不合法的操作系統調用。理想情況下,雖然它是相同的確切機制,但通過設置正確的寄存器來準備函數調用,調用函數,使用結果。嵌入式時,當您嘗試將代碼與庫鏈接和/或嘗試執行時,會出現問題。

如果您要求如何在不使用離散指令的情況下使用預製庫的情況下重新創建此功能。這是一個完全不同的主題,尤其是如果您使用的處理器沒有這些說明。您可以通過查看庫的源代碼來了解這些功能,和/或對有問題的功能進行反彙編,但這可能並不明顯。尋找這本書或一本類似於「Hacker's Delight」的書,書中充滿了執行數學功能的東西,這些功能本來不受語言或處理器支持。

+0

我反彙編了目標代碼,但我無法理解它。 這是一個龐大的代碼,我是編程新手,所以你能否給我一個更簡單的解決方案? – Pavitar 2010-08-29 07:56:53