Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在组件中推送和打印浮点值_Assembly_Gnu Assembler_Att - Fatal编程技术网

Assembly 在组件中推送和打印浮点值

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)

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