【问题标题】:Convert a float literal to int representation in x86 assembly?在 x86 程序集中将浮点文字转换为 int 表示?
【发布时间】:2018-06-06 20:29:22
【问题描述】:

以下C代码:

int main()
{
    float f;
    f = 3.0;
}

转换成如下汇编指令:

main:
  pushl %ebp
  movl %esp, %ebp
  subl $16, %esp
  flds .LC0
  fstps -4(%ebp)
  movl $0, %eax
  leave
  ret
.LC0:
  .long 1077936128

计算float 文字的.long/int 表示的正确方法是什么?

例如 10779361283.0 生成,用于上述示例


对于此示例,gcc-m32 -S -O0 -fno-stack-protector -fno-asynchronous-unwind-tables 标志一起使用,使用英特尔设置生成程序集输出。

参考文献

Compiler Explorer Link 带有编译标志和其他设置

【问题讨论】:

    标签: c assembly floating-point x86 ieee-754


    【解决方案1】:

    x86 FPU 硬件使用IEEE754 binary32 / binary64 表示float / double

    确定浮点数的 IEEE 754 表示对人类来说并非易事。在手写汇编代码中,使用.float.double 指令通常是个好主意:

    .float 3.0    # generates 3.0 as a 32 bit float
    .double 3.0   # generates 3.0 as a 64 bit float
    

    如果您真的想手动计算,请参阅explanations on Wikipedia。将其作为练习可能会很有趣,但对于实际编程而言,它很乏味且几乎无用。

    编译器在内部进行转换(四舍五入到最接近的可表示的 FP 值),因为 FP 值通常不直接来自源中的文字;它们可以来自不断的折叠。例如1.23 * 4.56 在编译时进行评估,因此编译器已经以浮点或双精度二进制表示的 FP 值结束。将它们打印回十进制以供汇编程序解析并重新转换为二进制会更慢,并且可能需要很多小数位。


    要将 32 位浮点数表示为 32 位整数,您可以使用an online IEEE754 converter,或类似这样的程序:

    #include <stdlib.h>
    #include <stdio.h>
    #include <stdint.h>
    #include <inttypes.h>
    
    int main(int argc, char *argv[])
    {
        union { uint32_t u32; float f32; } intfloat;
    
        if (argc != 2) {
            fprintf(stderr, "Usage: %s some-number\n", argv[0]);
            return EXIT_FAILURE;
        }
    
        intfloat.f32 = atof(argv[1]);
    
        printf("0x%08" PRIx32 "\n", intfloat.u32);
    
        return EXIT_SUCCESS;
    }
    

    【讨论】:

    • 你知道这个功能的 C 源代码吗?
    • 这是一个用于IEEE 754 转换的出色在线工具:FloatConverter
    • @janniks 我添加了一个执行此操作的程序。如果您曾经编写过汇编代码,请永远不要将浮点文字编码为整数。这对于下一个人阅读您的代码来说太糟糕了。
    • unsigned long 可能因 C 实现而异。最好使用 uint32_t。那么printf需要使用"0x%08" PRIx32 "\n"float 也可能有所不同(尽管 4 个字节非常常见),所以测试它的大小并不是一个坏主意。 (另外,return 语句不需要括号,u32 是一个比i32 更常见和更清晰的无符号 32 位整数名称。)
    • @EricPostpischil 因为只有两个汇编程序可以识别这种语法(Solaris as 和 GNU as),并且都有高质量的浮点解析例程,所以没什么好担心的。
    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2021-09-10
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多