Passando valore float da programma C all'assembler programma livello usando solo numeri interi registri?

voti
0

Per mia classe stiamo scrivendo un semplice programma asm (con C e x86-64 AT & T) che stampa tutti i bit di un numero intero o float. Ho il numero intero multa parte di lavoro. Per la parte galleggiante mio professore ci ha incaricato di passare il valore float utilizzando solo interi registri. Non troppo sicuro perché non c'è permesso ai registri uso galleggiante. Indipendentemente da ciò, qualcuno ha idee su come andare su questo?

È pubblicato 02/12/2019 alle 23:50
fonte dall'utente
In altre lingue...                            


1 risposte

voti
1

il mio professore ci ha incaricato di passare il valore float utilizzando solo interi registri.

Un approccio semplice è copiare il floatin numero intero usandomemcpy()

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

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

Un altro è quello di utilizzare un union. Forse usando un letterale 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 ------- ^
}

Entrambi richiedono che il tipo intero utilizzato e la floathanno le stesse dimensioni.

Altri problemi riguardano assicurare il corretto endian dei due, ma molto comunemente le endians del floate intero corrisponderà.

Risposto il 08/12/2019 a 01:37
fonte dall'utente

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