Floating point 如何在GNUGAS中使用十六进制浮点文字?

Floating point 如何在GNUGAS中使用十六进制浮点文字?,floating-point,gnu-assembler,Floating Point,Gnu Assembler,C99引入十六进制浮点文字作为一种新的代码混淆技术,例如: assert(0x1.8p0 == 1.5); 我可以在我的GNU气体装配代码中达到同样的模糊程度吗,或者我必须求助于.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

C99引入十六进制浮点文字作为一种新的代码混淆技术,例如:

assert(0x1.8p0 == 1.5);
我可以在我的GNU气体装配代码中达到同样的模糊程度吗,或者我必须求助于
.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

如果我尝试,例如:

    float_1_5: .double 0x1.8e0
气体2.30只是高兴地将其视为1.8(大约因为不可代表),非常好的行为

而以下几项无法组装,这至少没有那么糟糕:

    float_1_5: .double 0x1.8p0
错误:

 Error: junk at end of line, first unrecognized character is `p'
一个人能平静地控制他的IEEE 754有效位的52位吗


我已经放弃了直接在
.text
区域中使用浮点文本

cpp
宏+气体位操作解决方案

这不是真正的十六进制浮点,但它是十六进制浮点和写入原始浮点整数常量之间的合理中介:

#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)
主要的烦恼是你必须得到52个尾数位的正确。但一旦你做了第一件事,你就只需要复制、粘贴和更改位了

带断言的可运行GitHub上游:


似乎
llvm,因为
支持十六进制浮点:@SimonByrne如果你找到了文档,就去找答案:-)我找不到它的任何文档。
.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)