Passing Gleitkommawert von C-Programm Assembler-Ebene-Programm unter Verwendung nur ganzzahlige Register?

stimmen
0

Für meine Klasse schreiben wir ein einfaches asm-Programm (mit C und AT & T x86-64), die Drucke alle Bits Integer oder Float. Ich habe die Integer-Teil funktioniert gut. Für den Schwimmer Teil hat mein Professor uns angewiesen, nur den float-Wert integer Register zu übergeben. Nicht ganz sicher, warum wir nicht zu verwenden Schwimmer Register erlaubt. Unabhängig davon, hat jemand Ideen, wie um dies zu realisieren?

Veröffentlicht am 02/12/2019 um 23:50
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

mein Professor hat uns angewiesen, nur den Float-Wert integer Register zu übergeben.

Ein einfacher Ansatz ist die zum Kopieren floatin eine ganze Zahl mitmemcpy()

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

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

Ein weiterer Grund ist ein zu verwenden union. Vielleicht mit einer Verbindung wörtliche .

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 erfordern , dass die Integer - Typ verwendet wird und die floatdie gleiche Größe haben .

Weitere Themen die richtige Endian der beiden Versicherung, aber sehr häufig die endians von der floatund integer wird übereinstimmen.

Beantwortet am 08/12/2019 um 01:37
quelle vom benutzer

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