2016-05-02 11 views
1

私は、ARM968プロセッサのための私のプロジェクトをコンパイルするためののarmccアーム-gccのを使用しています。
フォーム関数呼び出しを返す場合、次のように、復帰命令である:特定の命令を異なる方法で翻訳するようにコンパイラに指示しますか?

Pop {ri-rj, pc} 

すべて押さレジスタが同じ命令でポップされます。

Pop {ri-rj} 
Pop {pc} 

私はPopを使用した場合のARMツールチェーンのいずれかに上記の規則を遵守するために、アセンブラやコンパイラに指示することができます:私はこのような何かに上記の命令を変更したいですか?

+2

いいえ、あなたはできません。どうしてあなたはそれをやりたいのですか? –

+0

あなたはもちろん組み立てることができますし、gccはオープンソースなので変更することができます。しかし、C言語そのものに特有のターゲットはありません。コンパイラにはいくつかの機能がありますが、必ずしも1つのツールチェーンから別のツールチェーンに移動する必要はありません。 –

+0

コンパイラはそれらを翻訳しない命令を生成しています。アセンブラはそれらを翻訳し、オープンソースであるため、gnuアセンブラで問題を攻撃することができます。一般的ではありません。 –

答えて

0

アセンブラを生成した後、処理を停止するようにgccに指示できます。手動で、またはsedを使用して、アセンブラファイルを編集できます。次にアセンブラファイルをbinutilsのasに渡して、オブジェクトファイルにアセンブルします。

$ cat test.c 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
     printf ("hello world\n"); 

     return 0; 
} 
$ gcc test.c -o test.s -S 
cat test.s 
     .file "test.c" 
     .section  .rodata 
.LC0: 
     .string "hello world" 
     .text 
     .globl main 
     .type main, @function 
main: 
.LFB0: 
     .cfi_startproc 
     pushq %rbp 
     .cfi_def_cfa_offset 16 
     .cfi_offset 6, -16 
     movq %rsp, %rbp 
     .cfi_def_cfa_register 6 
     subq $16, %rsp 
     movl %edi, -4(%rbp) 
     movq %rsi, -16(%rbp) 
     movl $.LC0, %edi 
     call puts 
     movl $0, %eax 
     leave 
     .cfi_def_cfa 7, 8 
     ret 
     .cfi_endproc 
.LFE0: 
     .size main, .-main 
     .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4" 
     .section  .note.GNU-stack,"",@progbits 
$ as test.s -o test.o 
+0

ありがとう@StianSkjelstad。 ** 1 - **この場合、** pop **のすべてのインスタンスを修正して、2つの異なる命令に分割しなければなりません。これにより、**コードセクション**のサイズが大きくなり、**リンケージ**中にツールチェーンによってトリミングされる可能性がありますか?出力フォーマットは** ARM ELF **です。これは私を2番目の質問に導きます。 ** 2 - ** ** ARM ELF **ファイルのさまざまなセクションのサイズを手動で変更する方法はありますか?これは「良い習慣」ですか? – Winston

+0

1)リンケージの前に組み立てられるので、何か問題があると警告が表示されます。 2)リンカスクリプト/スキャッタファイルを変更することができます。 –

+0

Sectionsは通常は固定サイズではなく、バイトが追加されると大きくなります。リンカスクリプトは、実行可能ファイルやライブラリの最後にリンクすると、セクションのマージ、並べ替え、破棄、破棄、ほとんどの人がリンカにデフォルト設定を使用させます。 –

4
問題の正確な性質に応じて

、あなたは新しい命令の一握りに大きく依存しているかどうか、別の可能性 ARMv4Tでは用にコンパイルするかもしれません。 ARMv5Tより前のバージョンでは、ldmがPCにインタワーキングされていないため、コンパイラはv4Tターゲットに対してその形式のリターン命令を発行しません。いくつかの簡単なテストコードのため、-march=armv5tしてコンパイルすると、このようにしてスタックフレームを生成する:

8: e92d4070  push {r4, r5, r6, lr} 
... 
    4c: d8bd8070  pople {r4, r5, r6, pc} 

-march=armv4tと同じことをコンパイルする同じプロローグを使用するが、間接的な復帰シーケンスで(上記のループ内から条件付きリターンたのに対し今、それはまた、関数の最後に出て移動しています):もちろん

48: da000006  ble  68 <func+0x68> 
... 
    68: e8bd4070  pop  {r4, r5, r6, lr} 
    6c: e12fff1e  bx  lr 

、それは、2つの別々のポップと同じ効果は、システムの根本的なバグが何であるかに依存しているかどうか - それはのようなものだ場合ldmとinのデータフェッチの間のタイミングジャンプ自体の命令フェッチは、これは十分に同等かもしれません。 AHBバーストが一定のサイズを超えて切り捨てられるような壊れたメモリシステムのように、おそらく全く異なるものになる可能性があるので、単一のldmで転送されるレジスタの数が問題になりますが、 memcpyのように簡単に修正することはできません。

関連する問題