在装配中推送和打印浮动值[重复]

问题描述 投票:2回答:1

这个问题在这里已有答案:

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

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

    pushl $3214514586 // or pushl $0xbf99999a
    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 $3214514586 // or pushl $0xbf99999a

    flds (%esp)
    fstpl (%esp)

    pushl $hello
    call printf
    leave
    ret
assembly gas att
1个回答
3
投票

在C float中,对varargs函数(例如printf)的argsments被提升为double。你的第二个代码将4字节的float转换为8字节的double,以便将正确的值传递给printf,但是它会覆盖ebp的保存值,因此可能会崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.