Předávání float hodnoty z programu C do assembleru programu na úrovni pouze pomocí číslo registry?

hlasů
0

Pro mé třídě píšeme jednoduchý asm program (s C a AT & T x86-64), která vytiskne všechny bity z integer nebo float. Mám celá část v pořádku. Pro float část můj profesor nám pokyn, aby předat hodnotu float pouze pomocí celočíselné registry. Ne příliš jisti, proč nejsme dovoleno používat float registrů. Bez ohledu na to, má někdo představu o tom, jak jít o tomto?

Položena 02/12/2019 v 23:50
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

můj profesor nám pokyn, aby předat hodnotu float pouze pomocí celočíselné registry.

Jednoduchý přístup je zkopírovat floatna celé číslo s použitímmemcpy()

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

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

Další možností je použít union. Možná, že použití sloučeniny doslovný .

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

Oba vyžadují, aby typ celé číslo použít, a floatmají stejnou velikost.

Další otázky zahrnují pojištění správného endian ze dvou, ale přesto velmi obyčejně endians části floata číslo se bude shodovat.

Odpovězeno 08/12/2019 v 01:37
zdroj uživatelem

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