在程序集中推送和打印浮点值[重复]
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 位)程序集中将无符号整数转换为浮点数?