Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Arm汇编浮点_Assembly_Floating Point_Arm_Cortex M_Microprocessors - Fatal编程技术网

Assembly Arm汇编浮点

Assembly Arm汇编浮点,assembly,floating-point,arm,cortex-m,microprocessors,Assembly,Floating Point,Arm,Cortex M,Microprocessors,嗨,我想知道这里是否有人能为我指出解决这个问题的方向 编写并运行ARM VFP汇编程序,以计算球体的体积:4(pi*r^3)/3(如果r=25.5)。 您的TI Launchpad支持浮点操作,但它在重置时关闭(因此您必须将其打开!) 这是我的教科书ARM汇编语言编程与体系结构中的一个问题 到目前为止,我写这段代码是为了解这个方程,我想知道如何输出这个值并确保启用了浮点 ; have to enable The CPAC register in order to use floating po

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

编写并运行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

我留下的一些代码是为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 );
然后“只”打印结果(grin)或使用调试器检查r0或任何您当前要查看的内容(我将32位寄存器打印为十六进制输出,将终端上寄存器中的uart 0x12345678打印为12345678)


如果您不想,或者您的构建系统无法处理调用汇编程序(或通过手动方式调用汇编程序,如-mthumb-mfpu=vfp-fun.s-o-fun.o),则可以将汇编文件(fun.s)直接馈送到gcc中然后将其链接到中,然后调用函数。

从ARMS文档CPAC或CPACR字段CP10和CP11一起控制对浮点协处理器的访问,如果实现,一个是双精度的,一个是单精度的。将11设置为这些位可以让您完全访问。提示将所有值写入cpac并将其读回…0xE000ED88是该寄存器的地址。仅在不启用协处理器的情况下执行这些值将导致未定义的指令,因此除非启用了它,否则无法输出任何值。您可以将其从浮点寄存器复制到通用寄存器(不是浮点到int)并从测试函数返回,或者将其保存到某个地址的内存中,然后使用ldr读取该地址并显示或以其他方式显示该地址。