2017-12-23 13 views
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 

答えて

3

(printfなど)可変引数関数にされていますダブルに昇格。 2番目のコードは、4バイトのfloatを8バイトのdoubleに変換して、正しい値をprintfに渡しますが、保存された値はebpに上書きされるため、クラッシュする可能性があります。

+0

あなたの答えの前半は現場ではありますが、私は2番目の回答を得ません - どこで保存されたebpを壊していますか? –

+0

私はそれを見ましたが、両方のスニペットに共通することを指摘しました。 –

+1

@Matteo、いいえ、最初の例は*スタック上の何も上書きしません。それだけでプッシュします。 2番目の例では、4バイトをプッシュしてから8バイトで上書きし、スタック上にあったものをすべて破棄します。これはebpの保存値です。 – prl

関連する問題