scanf и printf с плавающей точкой
Поэтому я следил за книгой Брюса Смита "Начинающие распианцы" и недавно работал с плавающей запятой. То, что я пытался сделать, - это прочитать в двух числах с плавающей запятой, умножить их и вывести обратно результат. Я могу читать и писать одну плавающую точку нормально, но когда я пытаюсь сделать вторую плавающую точку, она не дает мне число, которое я прочитал, а вместо этого адрес (или, по крайней мере, то, что я считаю адресом). Вот что я сделал до сих пор:
.global main
.func main
main:
PUSH {LR}
SUB SP, SP, #8
LDR R0, addr_prompt1
BL printf
LDR R0, addr_scantype
MOV R1, SP
BL scanf
VLDR S14, [SP]
VCVT.F64.F32 D5, S14
LDR R0, addr_prompt2
BL printf
LDR R0, addr_scantype
MOV R1, SP
BL scanf
VLDR S18, [SP]
VCVT.F64.F32 D0, S18
LDR R0, addr_result
VMOV R1, R2, D5
VSTR D0, [SP]
BL printf
ADD SP, SP, #8
POP {PC}
_exit:
MOV PC, LR
addr_prompt1: .word prompt1
addr_prompt2: .word prompt2
addr_scantype: .word scantype
addr_result: .word result
.data
prompt1: .asciz "Enter first number: "
prompt2: .asciz "Enter second number: "
scantype: .asciz "%f"
result: .asciz "YOur entered number is %f and %f.\n"
Если я просто печатаю плавающие точки, которые находятся в моем разделе данных, я должен поместить свой первый в регистры R2 и R3, а второй - в стек. Но по какой-то причине всякий раз, когда я внедряю scanf, мне приходится использовать регистры R1 и R2, иначе он не будет правильно печатать мой первый номер - и мой второй номер всегда будет неверным независимо от того, какие регистры я использую.
У кого-нибудь есть понимание того, почему это происходит, и что я должен сделать, чтобы оба моих номера вернулись правильно?