2017-05-10 87 views
0

嗨,我想知道這裏有沒有人能指點我解決這個問題的方向。Arm Assembly Floating Point

編寫並運行ARM VFP組裝程序來計算球體的體積:4(pi * r^3)/ 3如果r = 25.5。 你TI的Launchpad支持浮點運算,但它是在重置(所以你必須打開它!)

這是從我的教科書ARM彙編語言問題編程&架構

到目前爲止關掉我已經寫了這個代碼,以解決方程,並想知道如何我可以去輸出這個值,並確保我已經啓用了浮點。

; have to enable The CPAC register in order to use floating point: offset 0xD88 


VMOV.F32 S0, #25.5 ;SO NOW HOLDS THE CONSTANT 25.5 
VMOV.F32 S1, #3.14 ;S1 NOW HOLDS THE CONSTANT 3.14 
VMOV.F32 S2, #4  ;S2 NOW HOLDS THE CONSTANT 4 
VMOV.F32 S3, #3  ;S3 NOW HOLDS THE CONSTANT 3 

VMUL.F32 S4,S0,S0 ;S4 NOW HOLDS THE VALUE R^2 
VMUL.F32 S4,S4,S0 ;S4 NOW HOLDS THE VALUE R^3 

VMUL.F32 S5,S4,S1 ;S5 NOW HOLDS THE VALUE 3.14*R^3 

VMUL.F32 S6,S5,S2 ;S6 NOW HOLDS THE VALUE 4(3.14*R^3) 

VMUL.F32 S7,S6,S3 ;S7 NOW HOLDS THE VALUE (4(3.14*R^3))/3 

; v = 69455.9 
; this number V has to be converted to IEE in order to be output??? = 0100 0111 1000 0111 1010 0111 1111 0011 
+0

來自ARMS文檔CPAC或CPACR字段CP10和CP11共同控制對浮點協處理器的訪問,如果實現了 ,則一個是雙倍單一。將11設置爲這些位可以讓您完全訪問。提示將所有的1寫入cpac並將其讀回... 0xE000ED88是該寄存器的地址。 –

+0

只是在不啓用協處理器的情況下執行這些操作將最終成爲未定義的指令,因此除非啓用它,否則不能輸出任何值。你可以將它從一個浮點寄存器複製到一個通用寄存器(不能浮到int)並從測試函數返回,或者將它保存到某個地址的內存中,然後使用ldr讀取該地址,並顯示或以其他方式顯示。 –

回答

0

我留下了一些代碼,用於ti launchpad。

.thumb 
.thumb_func 
.globl fpu_init 
fpu_init: 
    ;@ basically straight from ti datasheet 
    ;@ set bits in CPAC 
    ldr r0,=0xE000ED88 
    ldr r1,[r0] 
    ldr r2,=0xF00000 
    orr r1,r2 
    str r1,[r0] 
    dsb 
    isb 
    bx lr 

.thumb_func 
.globl fun 
fun: 
    vmov s0,r0 
    vcvt.f32.u32 s0,s0 
    vmov s1,r1 
    vcvt.f32.u32 s1,s1 
    vmul.f32 s0,s0,s1 
    vcvt.u32.f32 s0,s0 
    vmov r0,s0 
    bx lr 


.thumb_func 
.globl ffun 
ffun: 
    vmov s0,r0 
    vcvt.f32.u32 s0,s0 
    vmov s1,r1 
    vcvt.f32.u32 s1,s1 
    vmul.f32 s0,s0,s1 
    vmov r0,s0 
    bx lr 

後者是不一樣的你的,但相當確信一個將結果轉換回整數其他簡單地返回浮子二進制圖案(簡單地移動S0比特以R0)。

這樣你就可以用你需要組裝它,然後你的結果調用它從C函數店R0

像這樣

.thumb_func 
.globl FUN 
FUN: 
    your code 
    vmov r0,s7 
    bx lr 

在C原型

什麼包裝您的功能
unsigned int FUN (void); 

然後「只」打印結果(笑)或使用調試器並檢查r0或任何你目前看到的東西(我打印32位寄存器爲十六進制uart 0x12345寄存器中的678打印在終端上爲12345678)。

如果你不想要或者你的編譯系統無法處理調用匯編程序(或手工彙編),那麼你可以將彙編文件(fun.s)直接送入gcc中,或者用手動裝配-mother-as -mthumb -mfpu = vfp fun.s -o fun.o),然後將其鏈接,然後調用該函數。