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

时间:2017-12-23 08:51:51

标签: assembly gas att

我将编译器编写为我的大学项目。我正处于代码生成阶段。而且我想知道为什么这不起作用(打印始终为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

1 个答案:

答案 0 :(得分:3)

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