3

アセンブリ ファイルで 512 x 32 ビット配列を指定したいのですが、これは次のようになります。

#define FUNCTION_01     test
#define LABEL_01(name)  .L ## test ## _ ## name

  .section ".data"
  my_array:
  .word 0x10101010
  .word 0x20101010
  .word 0x30101010
  .word 0x40101010
  ...

    .section ".text"
    .align 4
    .global FUNCTION_01
    .type   FUNCTION_01,#function

FUNCTION_01:

  add  %g0, 12, %l7           
  ld   [%l7 + my_array], %l7
  ...      
    ret
    restore

    LABEL_01(end):
    .size    FUNCTION_01,LABEL_01(end)-FUNCTION 

function_01 でやろうとしているのは、配列の 4 番目の要素にアクセスすることです。ただし、上記のアセンブリを SPARC アーキテクチャ用にコンパイルしようとすると、次のエラーが発生します。

(.text+0x75c): relocation truncated to fit: R_SPARC_13 against `.data'
collect2: ld returned 1 exit status

このエラーから何をすべきかわかりません。配列が大きすぎるということですか、それともコードに何か問題がありましたか?

4

2 に答える 2

2

警告: 私は sparc アセンブリを使用したことがありませんが、まだ誰も回答していないので、簡単なチュートリアルを行って、役立つかどうかを確認しました。

このページによると、命令の定数ldは現在の値の 4KiB 以内のオフセットでなければなりません。オフセットではなくアドレスを追加しようとしているため、エラーが発生します。また、データ セクションがテキスト セクションから 4 KiB 以上離れている可能性もあります。あなたがする必要があるのは、配列のアドレスを %l7 に入れて、12 バイトを定数として使用することldです。これを行うには、次のset命令を使用できます (これは実際には命令ではなく、アセンブラによってsethiandのor組み合わせに変更されます)。

set  my_array,%l7
ld   [%l7 + 12],%l7
于 2011-03-14T18:34:49.807 に答える
0

命令は 32 ビットのオペコードにアセンブルされます。これには、(特に)値 (つまり配列アドレス)ld [%l7 + my_array], %l7用の 13 ビット フィールドが含まれます。my_arrayエラー メッセージは、32 ビット アドレスを 13 ビット フィールドに適合させるのに問題があることをリンカが伝えていることです...

sethi32 ビット アドレスをレジスタにロードするには、(上位 22 ビットを設定する) とor(下位 10 ビットを設定する)という 2 つの命令を使用する必要があります。これは次のようになります。

sethi  %hi(my_array), %l7
or     %l7, %lo(my_array), %l7
ld     [%l7+12], %l7

4 番目の配列要素にアクセスします。最初の 2 つの命令は、疑似命令に置き換えることができますset

set    my_array, %l7
ld     [%l7+12], %l7

これにより、同じマシンコードが生成されます。どちらの方法でも、アセンブラはsethi22 ビット フィールドを持つorオペコードと 10 ビット データ フィールドを持つオペコードを生成し、それらのオペコードの場所をオブジェクト ファイル メタデータに書き込みます。my_arrayすべてのオブジェクト ファイルを取得し、最終的に配列を RAMのどこに配置するかを決定するリンカは、これらのフィールドを埋めます。注: コードを共有ライブラリ (.soファイル) に配置する場合は、さらに複雑になります。

于 2011-03-15T11:38:33.833 に答える