Πώς να χρησιμοποιήσετε το δεκαεξαδικό κινητής υποδιαστολής λεκτικές στο GNU GAS;

ψήφοι
1

C99 παρουσιάζει δεκαεξαδικό κινητής υποδιαστολής κατεξοχήν ως μια νέα τεχνική συσκότιση κώδικα, π.χ.

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

Μπορώ να επιτευχθεί το ίδιο επίπεδο συσκότιση στο GNU GAS κωδικό συναρμολόγηση μου, ή θα πρέπει να καταφύγουν σε .byteχειρωνακτική εργασία +;

Μπορείτε να χρησιμοποιήσετε αυτό ως βάση δοκιμών:

.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

Εδώ είναι μια πιο εκτελέσιμη έκδοση στο GitHub με διεκδικούν, αν θέλετε να το δοκιμάσετε .

Αν προσπαθήσω π.χ.

    float_1_5: .double 0x1.8e0

GAS 2.30 το αντιμετωπίζει μόνο χαρά και 1.8 (περίπου δεδομένου ότι δεν είναι παριστούμενα), θαυμάσια συμπεριφορά!

Και τα ακόλουθα απλά αποτυγχάνει να συγκεντρώσει, το οποίο τουλάχιστον δεν είναι τόσο κακό:

    float_1_5: .double 0x1.8p0

Λάθος:

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

Μπορεί ένας άνθρωπος ελέγχει τα 52 κομμάτια του ΙΕΕΕ 754 significand του στην ειρήνη;

Έχω ήδη παραιτηθεί από την κατεξοχήν float απευθείας στην .textπεριοχή ... Πώς μπορώ να καθορίσετε την άμεση αριθμούς κινητής υποδιαστολής με τη συναρμολόγηση inline;

Δημοσιεύθηκε 20/10/2018 στις 12:29
πηγή χρήστη
Σε άλλες γλώσσες...                            

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