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 12:29
quelle vom benutzer
In anderen Sprachen...                            

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