在程序集中使用 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
传递给可变参数函数:默认促销适用。)
这个程序的目的是添加 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
.
这就是您使用 C 编译器编译 C 函数时看到的结果。
我还建议对单精度加载使用 flds
,对双精度存储使用 fstpl
,以使大小明确。这也是越野车; load和store默认是一样的,这个程序需要float load和double store。 (默认为单精度float
, dword)
(printf "%f"
采用 double
因为无法将 C 中的 float
传递给可变参数函数:默认促销适用。)