臂组件浮点

时间:2017-05-10 01:17:27

标签: assembly floating-point arm cortex-m microprocessors

嗨,我想知道这里是否有人能指出我解决这个问题的方向。

编写并运行ARM VFP汇编程序以计算球体的体积:如果r = 25.5,则计算4(pi * r ^ 3)/ 3。 您的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

1 个答案:

答案 0 :(得分:0)

我留下的一些代码用于ti启动板。

.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 );

然后“只是”打印结果(grin)或使用调试器并检查r0或其他任何操作以查看当前的内容(我打印32位寄存器作为hex out out uart 0x12345678在寄存器中打印在终端上12345678)。

你可以直接将汇编文件(fun.s)提供给gcc,如果你不想要,或者你的构建系统无法处理调用汇编程序(或者手工组装arm-whatever-as -mthumb -mfpu = vfp fun.s - o fun.o)然后将其链接,然后调用该函数。