嗨,我想知道这里是否有人能指出我解决这个问题的方向。
编写并运行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
答案 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)然后将其链接,然后调用该函数。