在装配中推送和打印浮点值
Pushing and printing float value in assembly
我正在编写一个编译器作为我的大学项目。我在代码生成阶段。我想知道为什么这不起作用(打印始终为 0):
.extern printf
.section .data
hello:
.string "Hello %f!\n"
.section .text
.globl main
main:
pushl %ebp
movl %esp, %ebp
pushl 14514586 // or pushl [=10=]xbf99999a
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 14514586 // or pushl [=11=]xbf99999a
flds (%esp)
fstpl (%esp)
pushl $hello
call printf
leave
ret
在 C 中,可变参数函数(例如 printf)的浮点参数被提升为双精度。您的第二个代码将 4 字节浮点数转换为 8 字节双精度数,以便将正确的值传递给 printf,但是它会覆盖 ebp
的保存值,因此可能会崩溃。
我正在编写一个编译器作为我的大学项目。我在代码生成阶段。我想知道为什么这不起作用(打印始终为 0):
.extern printf
.section .data
hello:
.string "Hello %f!\n"
.section .text
.globl main
main:
pushl %ebp
movl %esp, %ebp
pushl 14514586 // or pushl [=10=]xbf99999a
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 14514586 // or pushl [=11=]xbf99999a
flds (%esp)
fstpl (%esp)
pushl $hello
call printf
leave
ret
在 C 中,可变参数函数(例如 printf)的浮点参数被提升为双精度。您的第二个代码将 4 字节浮点数转换为 8 字节双精度数,以便将正确的值传递给 printf,但是它会覆盖 ebp
的保存值,因此可能会崩溃。