Wie hexadezimal Gleitkomma-Literale in GNU GAS zu benutzen?

stimmen
1

C99 eingeführt hexadezimal Punkt Literale als neue Code-Verschleierung Technik schwimmen, zB:

assert(0x1.8p0 == 1.5);

Kann ich das gleiche Niveau der Verschleierung in meinem GNU GAS Assembler - Code erreichen, oder muß ich zurückgreifen .byte+ Handarbeit?

Sie können dies als Testbasis verwenden:

.data
    float_1_5: .double 1.5
    float_2_5: .double 2.5
    float_4_0: .double 4.0
.text
.global _start
_start:
    /* 1.5 + 2.5 == 4.0 */
    fldl float_1_5
    fldl float_2_5
    faddp %st, %st(1)
    fldl float_4_0
    fcomip %st(1)

    /* Exit syscall. */
    mov $1, %eax
    mov $0, %ebx
    int $0x80

Hier ist eine ausführbare Version auf GitHub mit einer Assertion , wenn Sie es heraus testen möchten .

Wenn ich versuche, zB:

    float_1_5: .double 0x1.8e0

GAS 2.30 nur glücklich behandelt sie als 1,8 (ungefähr da nicht darstellbaren), wunderbares Verhalten!

Und die folgende nicht nur montieren, die zumindest nicht so schlecht ist:

    float_1_5: .double 0x1.8p0

Error:

 Error: junk at end of line, first unrecognized character is `p'

Kann ein Mann, der die 52 Bits seiner IEEE 754 Signifikanden in Frieden kontrollieren?

Ich habe bereits auf Float Literale direkt am aufgegeben .textBereich ... Wie gebe ich sofort Gleitkommazahlen mit Inline - Assembler?

Veröffentlicht am 20/10/2018 um 11:29
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

cpp Makros + GAS Bit-Manipulations Abhilfe

Das ist nicht wahr hex Punkt schwimmen, aber es ist eine vernünftige Zwischen zwischen hex Schwimmern und Schreiben roh Gleitkomma-Integer-Konstanten:

#define LKMC_FLOAT_64_SIGN_BITS 1
#define LKMC_FLOAT_64_EXP_BITS 11
#define LKMC_FLOAT_64_MANTISSA_BITS 52
#define LKMC_FLOAT_64_EXP_BIAS ((1 << (LKMC_FLOAT_64_EXP_BITS - 1)) - 1)
#define LKMC_FLOAT_64(sign, exp, mantissa) ((((sign << LKMC_FLOAT_64_EXP_BITS) | exp + LKMC_FLOAT_64_EXP_BIAS) << LKMC_FLOAT_64_MANTISSA_BITS) | mantissa)

Verwendungszweck:

.data
    double_1_5: .quad LKMC_FLOAT_64(0x0, 0x0, 0x8000000000000)
    double_2_5: .quad LKMC_FLOAT_64(0x0, 0x1, 0x4000000000000)
    double_4_0: .quad LKMC_FLOAT_64(0x0, 0x2, 0x0000000000000)

Das größte Ärgernis ist, dass Sie die 52 Mantissenbits korrekt erhalten haben. Aber sobald man die ersten tut, ist es nur eine Frage der Kopie es um das Einfügen und die Bits zu verändern.

Runnable GitHub mit Assertionen Upstream:

Beantwortet am 29/06/2019 um 17:44
quelle vom benutzer

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