Передача значение с плавающей точкой из программы C на ассемблере программы уровня с использованием только целым числом регистров?

голоса
0

Для моего класса мы пишем простую программу ассемблера (с C и AT & T x86-64), которая печатает все биты целого или поплавка. У меня есть целая часть работает отлично. Для поплавковой части моего профессор поручил нам передать значение с плавающей точкой только с помощью целого числа регистров. Не слишком уверен, почему мы не разрешается использовать регистры с плавающей точкой. Независимо от того, кто-нибудь есть идеи о том, как идти об этом?

Задан 02/12/2019 в 23:50
источник пользователем
На других языках...                            


1 ответов

голоса
1

мой профессор поручил нам передать значение с плавающей точкой только с помощью целого числа регистров.

Простой подход , чтобы скопировать floatв целое число , используяmemcpy()

float f = ...;
assert(sizeof f == sizeof(uint32_t));

uint32_t u;
memcpy(&u, &f, sizeof u);
foo(u);

Другой заключается в использовании union. Возможно , используя соединение Literal .

void foo (uint32_t);

int main() {
  float f;
  assert(sizeof f == sizeof(uint32_t));

  //  v----------- compound literal -----------v
  foo((union { float f; uint32_t u; }) { .f = f}.u);
  //   ^------ union object ------- ^
}

Оба требуют , что типа целого числа , используемого и floatимеют одинаковый размер.

Другие проблемы включают в себя страхование правильных обратного порядка байт из двух, но очень часто в блефускианском из floatи целого числа будет соответствовать.

Ответил 08/12/2019 в 01:37
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more