在程序集中推送和打印浮点值[重复]

Posted

技术标签:

【中文标题】在程序集中推送和打印浮点值[重复]【英文标题】:Pushing and printing float value in assembly [duplicate] 【发布时间】:2017-12-23 08:51:51 【问题描述】:

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

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

【讨论】:

你答案的前半部分是正确的,但我没有得到第二部分 - 他在哪里破坏了保存的 ebp? 不,现在我明白了,但我要指出这对两个 sn-ps 来说都很常见。 @Matteo,不,第一个示例不会覆盖堆栈上的任何内容;它只是推动。第二个示例压入 4 个字节,然后用 8 个字节覆盖它,破坏堆栈上它上面的任何内容,这是 ebp 的保存值。 第一个例子也可以覆盖保存的ebp值,因为函数被允许修改它们的参数。 即使在使用 gcc -m32 的情况下,它是否也会提升一倍?

以上是关于在程序集中推送和打印浮点值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 x86(32 位)程序集中将无符号整数转换为浮点数?

在 x86 程序集中打印十六进制值

获取 .NET 程序集的日期 [重复]

合并R中的数据集:对于两个数据集中的每个值,在第三个数据集中创建一个新行[重复]

如何从结果集中打印值而没有列中的任何重复记录

将程序集作为模块/插件加载,同时避免重复和脆弱性