gpt4 book ai didi

将浮点文字转换为 x86 程序集中的 int 表示形式?

转载 作者:行者123 更新时间:2023-12-02 20:23:17 24 4
gpt4 key购买 nike

以下 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 表示形式的正确方法是什么?

例如3.0生成的1077936128,上面显示的示例


For this example gcc is used with the -m32 -S -O0 -fno-stack-protector -fno-asynchronous-unwind-tables flags using intel settings to generate the assembly output.

引用文献:

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

最佳答案

x86 FPU 硬件使用IEEE754 binary32/float/double 的二进制64 表示。

确定 float 的 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 在编译时进行评估,因此编译器最终会得到浮点或 double 二进制表示形式的 FP 值。将它们打印回十进制以便汇编器解析并重新转换为二进制会更慢,并且可能需要很多小数位。


要将 32 位 float 计算为 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;
}

关于将浮点文字转换为 x86 程序集中的 int 表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50729068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com