Passando valor float de programa C para assembler programa nível usando apenas inteiro registros?

votos
0

Para minha turma estamos escrevendo um programa asm simples (com C e AT & T x86-64) que imprime todos os bits de um inteiro ou float. Eu tenho a multa parte de trabalho inteiro. Para a parte flutuador meu professor nos instruiu para passar o valor float usando apenas inteiros registros. Não sei bem por que não está autorizado a registros uso flutuador. Independentemente disso, alguém tem ideias sobre como fazer isso?

Publicado 02/12/2019 em 23:50
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

meu professor nos instruiu para passar o valor float usando apenas inteiros registros.

Uma abordagem simples é copiar o floatem um inteiro usandomemcpy()

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

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

Outra é usar um union. Talvez usando um literal composto .

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 ------- ^
}

Ambos requerem que o tipo e número inteiro utilizado o floatsão do mesmo tamanho.

Outras questões incluem segurar o endian correta dos dois, mas muito comumente os endians do floate inteiro irá corresponder.

Respondeu 08/12/2019 em 01:37
fonte usuário

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