在装配中推送和打印浮点值

Pushing and printing float value in assembly

我正在编写一个编译器作为我的大学项目。我在代码生成阶段。我想知道为什么这不起作用(打印始终为 0):

.extern printf
.section .data
hello:
    .string "Hello %f!\n"
.section .text
.globl main
main:
    pushl %ebp
    movl %esp, %ebp

    pushl 14514586 // or pushl [=10=]xbf99999a
    pushl $hello
    call printf

    leave
    ret

但这可以正常工作:

.extern printf
.section .data
hello:
    .string "Hello %f!\n"
.section .text
.globl main
main:
    pushl %ebp
    movl %esp, %ebp

    pushl 14514586 // or pushl [=11=]xbf99999a

    flds (%esp)
    fstpl (%esp)

    pushl $hello
    call printf
    leave
    ret

在 C 中,可变参数函数(例如 printf)的浮点参数被提升为双精度。您的第二个代码将 4 字节浮点数转换为 8 字节双精度数,以便将正确的值传递给 printf,但是它会覆盖 ebp 的保存值,因此可能会崩溃。