При работе с числами с плавающей точкой может потребоваться преобразование, например, сделать из числа single
число double
и наоборот, либо выполнить преобразование
между числами с плавающей точкой и целыми числами. Для этого применяется ряд инструкций.
Инструкция FCVT выполняет преобразование из single в double и обратно и имеет следующие формы:
FCVT Dn, Sm // преобразование из single (в регистре Sm) в double, результат в регистре Dn FCVT Sn, Dm // преобразование из double в single, результат в регистре Sn FCVT Sn, Hm // преобразование из half в single, результат в регистре Sn FCVT Hn, Sm // преобразование из single в half, результат в регистре Hn
Для преобразования целых чисел в числа с плавающей точкой имеются инструкции
SCVTF: для преобразования целых чисел со знаком
SCVTF Dn, Xm // в регистр Dn помещается результат преобразования в double числа из Xm
UCVTF: для преобразования целых чисел без знака
UCVTF Dn, Xm // в регистр Dn помещается результат преобразования в double числа из Xm
Для преобразования чисел с плавающей точкой в целое число есть ряд инструкций:
FCVTAS: для преобразования чисел со знаком c округлением в ближайшего целого
FCVTAS Wd, Hn
FCVTAU: для преобразования чисел без знака c округлением в ближайшего целого
FCVTAU Wd, Sn
FCVTMS: для преобразования чисел со знаком c округлением до отрицательной бесконечности (Например, число 3.5 округляется до 3, а число -3.5 - до -4)
FCVTMS Xd, Dn
FCVTMU: для преобразования чисел без знака c округлением до отрицательной бесконечности
FCVTMU Xd, Dn
FCVTPS: для преобразования чисел со знаком c округлением до положительной бесконечности (Например, число 3.1 округляется до 4, а число -3.1 - до -3)
FCVTPS Xd, Dn
FCVTPU: для преобразования чисел без знака c округлением до положительной бесконечности
FCVTPU Xd, Dn
FCVTZS: для преобразования чисел со знаком c округлением в сторону нуля (Например, число 3.5 округляется до 3, а число -3.5 - до -3)
FCVTZS Xd, Dn
FCVTZU: для преобразования чисел без знака c округлением в сторону нуля
FCVTZU Xd, Dn
Например, мы хотим вывести на консоль значение одного числа типа single с помощью функции printf
языка C. Но эта функция принимает только 64-разрядные числа с плавающей точкой.
.global main main: STR LR, [SP, #-16]! LDR X0, =number // загружаем указатель на число number LDR S1, [X0] // загружаем данные по адресу из X0 в регистр S0 FMOV W1, S1 // помещаем число single в W1 (X1) для форматированного вывода в printf LDR X0, =prtstr // загружаем строку форматирования BL printf // вызываем функцию printf MOV X0, #0 // код возврата LDR LR, [SP], #16 RET .data number: .single 12.3456 prtstr: .asciz "number: %f\n"
В данном случае помещаем в регистр S1 число number (12.3456), и для вывода с помощью функции printf далее передаем данные из S1 в W1, но при выполнении программа выведет нам следующее
number: 0.000000
Теперь применим преобразование из single в double:
.global main main: STR LR, [SP, #-16]! LDR X0, =number // загружаем указатель на число number LDR S1, [X0] // загружаем данные по адресу из X0 в регистр S0 FCVT D0, S1 // преобразуем число single из S1 в число double в D0 FMOV X1, D0 // помещаем число X1 для форматированного вывода в printf LDR X0, =prtstr // загружаем строку форматирования BL printf // вызываем функцию printf MOV X0, #0 // код возврата LDR LR, [SP], #16 RET .data number: .single 12.3456 prtstr: .asciz "number: %f\n"
Консольный вывод в данном случае
number: 12.345600