Assembly ARM:浮点(VFP)指令赢得';推入堆栈时不工作
我正在尝试在ARM汇编中打印一些浮点值。只要我不将内容推入堆栈,值就会正确打印。如果我按下某个按钮,它只会打印0 这段代码之所以有效,是因为它不会将内容推入堆栈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.
.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字节。