Assembly ARM:浮点(VFP)指令赢得';推入堆栈时不工作

Assembly ARM:浮点(VFP)指令赢得';推入堆栈时不工作,assembly,floating-point,arm,libc,Assembly,Floating Point,Arm,Libc,我正在尝试在ARM汇编中打印一些浮点值。只要我不将内容推入堆栈,值就会正确打印。如果我按下某个按钮,它只会打印0 这段代码之所以有效,是因为它不会将内容推入堆栈 .global main .func main main: LDR R0, value_address @ Get address of value VLDR S14, [R0] @ Move value into single precision S14 register VCVT.F64.

我正在尝试在ARM汇编中打印一些浮点值。只要我不将内容推入堆栈,值就会正确打印。如果我按下某个按钮,它只会打印0

这段代码之所以有效,是因为它不会将内容推入堆栈

    .global main
    .func main

main:
  LDR R0, value_address @ Get address of value
  VLDR S14, [R0]        @ Move value into single precision S14 register
  VCVT.F64.F32 D0, S14  @ Convert single precision to double precision for printf

  LDR R0, =string       @ Give R0 the address of the string
  VMOV R2, R3, D0       @ Get the double precision value stored in registers
  BL printf             @ call printf

  MOV R7, #1            @ Exit syscall
  SWI 0

value_address:  .word value

.data
value:  .float 3.141592
string: .asciz "Floating point value is: %f\n"
我得到以下输出:

pi@raspberrypi:~/aal $ gcc -o printfp printfp.s
pi@raspberrypi:~/aal $ ./printfp
Floating point value is: 3.141592
然后我修改它以使用堆栈来保存
LR
,但它不能正常工作。我以前在没有VFP指令的情况下做过,它可以工作

    .global main
    .func main

main:
    PUSH {LR}

    LDR R0, value_address   @ Get address of value
    VLDR S14, [R0]          @ Move value into single precision S14 register
    VCVT.F64.F32 D0, S14    @ Convert single precision to double precision for printf

    LDR R0, =string         @ Give R0 the address of the string
    VMOV R2, R3, D0         @ Get the double precision value stored in registers
    BL printf               @ call printf

    POP {PC}
    BX LR

value_address:  .word value

.data
value:  .float 3.141592
string: .asciz "Floating point value is: %f\n"
现在我得到这个值:

pi@raspberrypi:~/aal $ gcc -o printfp printfp.s
pi@raspberrypi:~/aal $ ./printfp
Floating point value is: 0.000000

所以我不确定我做错了什么。有人能帮我吗

可能是堆栈未对齐问题吗?EABI要求堆栈8字节对齐。这可能是堆栈未对齐的问题吗?EABI要求堆栈对齐8字节。