2
大学のプロジェクトとしてコンパイラーを書く。私はコードを生成する段階にあります。これは、(印刷物常に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
が、これは正常に動作します:Cフロートargmentsで
.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
あなたの答えの前半は現場ではありますが、私は2番目の回答を得ません - どこで保存されたebpを壊していますか? –
私はそれを見ましたが、両方のスニペットに共通することを指摘しました。 –
@Matteo、いいえ、最初の例は*スタック上の何も上書きしません。それだけでプッシュします。 2番目の例では、4バイトをプッシュしてから8バイトで上書きし、スタック上にあったものをすべて破棄します。これはebpの保存値です。 – prl