Passen float waarde van C programma om assembler niveau programma met alleen integer registers?

stemmen
0

Voor mijn klas zijn we het schrijven van een eenvoudige ASM-programma (met C en AT & T x86-64) dat drukt alle bits van een integer of float. Ik heb het gehele deel werkt prima. Voor de vlotter deel mijn professor heeft ons de opdracht om de float waarde alleen met behulp van integer registers passeren. Niet al te zeker waarom we niet toegestaan ​​om gebruik te maken float registers. Hoe dan ook, heeft iemand ideeën over hoe om te gaan over dit hebben?

De vraag is gesteld op 02/12/2019 om 23:50
bron van user
In andere talen...                            


1 antwoorden

stemmen
1

mijn professor heeft ons de opdracht om de float waarde alleen met behulp van integer registers passeren.

Een eenvoudige benadering is het kopiëren floatin een integer gebruikmemcpy()

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

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

Een andere is om een te gebruiken union. Indien nodig met behulp verbinding letterlijke .

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

Beide vereisen dat de integer gebruikt en floatzijn even groot.

Andere problemen zijn het verzekeren van de juiste endian van de twee, maar toch zeer vaak de endians van de floaten integer zullen evenaren.

antwoordde op 08/12/2019 om 01:37
bron van user

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