在程序集中使用 printf 正确显示浮点数

properly display float with printf in assembly

这个程序的目的是添加 2 个浮点数并显示它们各自的结果,但程序给出了不需要的结果,我不明白为什么有必要为浮点数分配 16 个字节而不是 double 占用 8 个字节,所以为什么不只分配8 个字节用于浮点数?

    .text
    .globl  main
    .type   main, @function
main:
    subl    ,    %esp    # allocate enough memory for a floating point value
    flds    (V0)        # load loading single precision variable 1
    flds    (V1)        # load single precision variable 2
    fadd    %st(1), %st(0)      # add both of them [ NOTE: reg ST(0) contains correct result ]
    fstpl   (%esp)      # store the float
    pushl   $.LC0
    call    printf
    addl    ,    %esp    # return allocated mem to OS [ 12 + 4 = 16 ]
    ret

.LC0:   .string "%f\n"

V0: .float 9.3
V1: .float 9.4

我觉得有问题; ESP 是 16 字节对齐的 调用 main 之前(推送一个 4 字节 return 地址),所以它应该使用 sub , %esp在调用 printf.

之前按照 i386 System V ABI 的要求重新创建 16 字节对齐(假设您在 Linux)

这就是您使用 C 编译器编译 C 函数时看到的结果。

我还建议对单精度加载​​使用 flds,对双精度存储使用 fstpl,以使大小明确。这也是越野车; load和store默认是一样的,这个程序需要float load和double store。 (默认为单精度float, dword)

printf "%f" 采用 double 因为无法将 C 中的 float 传递给可变参数函数:默认促销适用。)