Assembly 在组件中推送和打印浮点值
我的大学项目是编写编译器。我正处于代码生成阶段。我想知道为什么这不起作用(打印总是0): 但这是正确的:Assembly 在组件中推送和打印浮点值,assembly,gnu-assembler,att,Assembly,Gnu Assembler,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 flds (%esp)
.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
在C中,varargs函数(如printf)的float参数升级为double。您的第二个代码将4字节浮点值转换为8字节双精度值,以便将正确的值传递给printf,但是它会覆盖
ebp
的保存值,因此可能会崩溃。您的答案的前半部分是正确的,但我没有得到第二个-他在哪里破坏保存的ebp?不,好吧,现在我看到了,但我要指出的是,这两个代码段都有相同之处。@Matteo,不,第一个示例没有覆盖堆栈上的任何内容;它只是推。第二个示例推送4个字节,然后用8个字节覆盖它,删除堆栈上它上面的任何内容,这是ebp的保存值。第一个示例还可以覆盖保存的ebp
值,因为允许函数修改它们的参数。在使用gcc-m32时是否会升级为双倍?
.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