2011-07-19 5 views
0

は、私はいくつかのCコードを書くと仮定し、それはこのようになりますいくつかのアセンブリを生成:私は右のメインの間では、より多くのアセンブリコードを挿入するにはどうすればよいアセンブリコードをプログラムに接頭辞としてGCCを使用するにはどうすればよいですか?

 

.text 

main: 
    mvs $r3, $sp 
    addi $r3, $r3, -16 
    mvs $sp, $r3 
    mvs $r3, $sp 
    addi $r3, $r3, 3 
    shri $r3, $r3, 2 
    shai $r3, $r3, 2 
    call __main 
    sti 8($r3), 25 
    sti 4($r3), 23 
    sti ($r3), 43 
L2: ld $r4, 8($r3) 
    ld $r5, 4($r3) 
    add $r4, $r4, $r5 
    st 8($r3), $r4 
    ld $r4, 8($r3) 
    ld $r5, 4($r3) 
    sub $r4, $r4, $r5 
    st ($r3), $r4 
    jmp L2 

:最初の行を? 目的は、Cコードからガスで生成されたアセンブリコードを実行する前に、すべてのレジスタを0に設定することです。これは、私が作業している特定のプロセッサで必要とされるレジスタの値をデフォルトにするために行われます。

gccリンカとカスタムオブジェクトファイルを使って私のカスタムコードでプロジェクトをアセンブルしようと考えましたが、リンカでそのような機能があるかどうかはわかりません。

私はcrtbegin.asmの使用を検討しましたが、これは実際にはC++コンストラクタ/デコンストラクタをサポートするためのものだと思います。それは私を助けません。

アイデア?

+0

これをインラインアセンブリコードとしてCコードファイル内に挿入するだけで動作しますか?あるいは、これは 'main'関数が始まる前に起こらなければなりませんか? –

+0

理想的には、main関数内で、生成されるコードの前に発生するのが理想です。私はTARGET_ASM_FILE_STARTを使ってコードを注入できることを知ったが、悪い/間違っていると思う.textの前にも起こる。 – RGroppa

答えて

1

http://www.dis.com/gnu/gccint/Function-Entry.html

TARGET_ASM_FUNCTION_PROLOGUEは任意の前に、メインの内側に右そこにあなたが望む任意のコードを貼り付けます、その中にこのようなものを入れて

他のコードが発行されます。私はこの答えをここに残しているので、この質問を検索する誰かが答えを得ることができます。 :)

0

main()定義の直後にインラインアセンブリasm(" ... ")を使用することができます。しかし、これはGCCがスタックポインタを設定した後に実際に表示されることがあります。

もう一つのオプションは、アセンブリファイルをリンカーに渡すことです。リンク時に最初のオブジェクトとして渡すようにしてください。私はこれを行うために正確にどのように把握

// Clear registers 
move 0, $r0 
move 0, $r1 

// Jump to main 
jsr main 
+0

これは事実ですが、残念なことに、スタックポインタが設定される前でも要件が必要になります。 – RGroppa

+0

ああ、そうです。私の投稿を別の提案で編集しました。 – kcbanner

関連する問題