Реализовать на ассемблере функцию для работы с числами половинной точности - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Реализовать на ассемблере функцию для работы с так называемыми числами половинной точности (формат binary16 стандарта IEEE 754-2008. В прототипах функций, приведённых ниже, обозначается как fp16_t) -утилита доступа к полям числа:
Листинг программы
  1. /*
  2. * Возвращает 0, если число положительное, и 1, если отрицательное
  3. */
  4. int fp16_sign(fp16_t f);
Чтобы проверить правильность написания программы: Вводим f = 0x3C00, должно вывести 0x0 Вводим f = 0xBC00, должно вывести 0x1 Вводим f = 0x3555, должно вывести 0x0 Вводим f = 0x39B7, должно вывести 0x0 Вводим f = 0x5640, должно вывести 0x0

Решение задачи: «Реализовать на ассемблере функцию для работы с числами половинной точности»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. typedef uint16_t fp16_t;
  5.  
  6. int fp16_sign(fp16_t f)
  7. {
  8.     int sign = 0;
  9.     __asm(
  10.         "shl $1, %1;"
  11.         "adc $0, %0"
  12.         : "+r" (sign)
  13.         : "r" (f));
  14.     return sign;
  15. }
  16.  
  17. int main()
  18. {
  19.     fp16_t x;
  20.     scanf("%hx", &x);
  21.     printf("%#x\n", fp16_sign(x));
  22.     return 0;
  23. }

Объяснение кода листинга программы

  1. Подключение необходимых заголовочных файлов: и .
  2. Объявление типа данных, с которым будет работать функция: fp16_t.
  3. Реализация функции fp16_sign, принимающей аргумент типа fp16_t f.
  4. Внутри функции объявление переменной sign типа int для хранения результата.
  5. Использование ассемблерной вставки для реализации функции:
    • shl $1, %1; - сдвиг бита знака вправо на 1 позицию.
    • adc $0, %0 - сложение со специальным значением, приводящее к корректному определению знака числа.
    • :+r` (sign) - синтаксис вставки аргументов в ассемблерную вставку.
    • +r (sign) - передача переменной sign как аргумента в ассемблерную вставку.
    • :r` (f) - синтаксис вставки аргументов в ассемблерную вставку.
    • r (f) - передача аргумента f как временной регистровой переменной в ассемблерную вставку.
  6. Возврат значения переменной sign из функции.
  7. В функции main():
    • Объявление переменной x типа fp16_t.
    • Считывание значения x с помощью функции scanf.
    • Вывод значения функции fp16_sign с аргументом x с помощью функции printf.
  8. Завершение функции main() и программы в целом.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы