我将编译器编写为我的大学项目。我正处于代码生成阶段。而且我想知道为什么这不起作用(打印始终为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
答案 0 :(得分:3)
在C float中,对varargs函数(例如printf)的argsments被提升为double。您的第二个代码将4字节的float转换为8字节的double,以便将正确的值传递给printf,但是它会覆盖保存的ebp
值,因此可能会崩溃。