Passerer flytverdien fra C program til assembler-nivåprogrammet ved hjelp av bare heltall registre?

stemmer
0

For min klasse er vi skrive en enkel ASM program (med C og AT & T x86-64) som skriver ut alle biter av et heltall eller flyte. Jeg har heltallsdelen fungerer fint. For flytedelen min professor har instruert oss å passere flyte verdien bare bruker heltall registre. Ikke så sikker på hvorfor vi ikke har lov til å bruke float registre. Uansett, er det noen som har ideer om hvordan du skal gå om dette?

Publisert på 02/12/2019 klokken 23:50
kilden bruker
På andre språk...                            


1 svar

stemmer
1

min professor har instruert oss å passere flyte verdien bare bruker heltall registre.

En enkel fremgangsmåte er å kopiere floattil et heltalls ved hjelpmemcpy()

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

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

En annen er å bruke en union. Kanskje ved hjelp av en forbindelse bokstavelig .

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

Begge krever at heltallet typen som brukes, og den floater av samme størrelse.

Andre problemer inkluderer opprettholde riktig endian av de to, men svært ofte de endians av floatog heltall vil matche.

Svarte 08/12/2019 kl. 01:37
kilden bruker

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