Реализовать на ассемблере функцию для работы с числами половинной точности - C (СИ)
Формулировка задачи:
Реализовать на ассемблере функцию для работы с так называемыми
числами половинной точности (формат binary16 стандарта IEEE 754-2008. В прототипах функций, приведённых ниже, обозначается как fp16_t)
-утилита доступа к полям числа:Чтобы проверить правильность написания программы:
Вводим f = 0x3C00, должно вывести 0x0
Вводим f = 0xBC00, должно вывести 0x1
Вводим f = 0x3555, должно вывести 0x0
Вводим f = 0x39B7, должно вывести 0x0
Вводим f = 0x5640, должно вывести 0x0
/* * Возвращает 0, если число положительное, и 1, если отрицательное */ int fp16_sign(fp16_t f);
Решение задачи: «Реализовать на ассемблере функцию для работы с числами половинной точности»
textual
Листинг программы
#include <stdio.h>
#include <stdint.h>
typedef uint16_t fp16_t;
int fp16_sign(fp16_t f)
{
int sign = 0;
__asm(
"shl $1, %1;"
"adc $0, %0"
: "+r" (sign)
: "r" (f));
return sign;
}
int main()
{
fp16_t x;
scanf("%hx", &x);
printf("%#x\n", fp16_sign(x));
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых заголовочных файлов:
и . - Объявление типа данных, с которым будет работать функция: fp16_t.
- Реализация функции fp16_sign, принимающей аргумент типа fp16_t f.
- Внутри функции объявление переменной sign типа int для хранения результата.
- Использование ассемблерной вставки для реализации функции:
shl $1, %1;- сдвиг бита знака вправо на 1 позицию.adc $0, %0- сложение со специальным значением, приводящее к корректному определению знака числа.:+r` (sign) - синтаксис вставки аргументов в ассемблерную вставку.+r(sign) - передача переменной sign как аргумента в ассемблерную вставку.:r` (f) - синтаксис вставки аргументов в ассемблерную вставку.r(f) - передача аргумента f как временной регистровой переменной в ассемблерную вставку.
- Возврат значения переменной sign из функции.
- В функции main():
- Объявление переменной x типа fp16_t.
- Считывание значения x с помощью функции scanf.
- Вывод значения функции fp16_sign с аргументом x с помощью функции printf.
- Завершение функции main() и программы в целом.