2017-05-10 51 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),然后将其链接,然后调用该函数。