7

ARMアセンブラコードでLONG_MINやLONG_MAXなどの外部定義を使用するにはどうすればよいですか?

my_arm.hが次のようになっているとしましょう。

int my_arm(int foo);

次のようにmy_main.cがあるとします。

...
#include <limits.h>   
#include "my_arm.h"
...
int main (int argc, char *argv[])
{
  int foo=0;
...
  printf("My arm assembler function returns (%d)\n", my_arm(foo));
...
}

そして、my_arm.sは次のようになります。

  .text
  .align 2
  .global my_arm
  .type   my_arm, %function
my_arm:
    ...
    ADDS r1, r1, r2
    BVS overflow
    ...
overflow: 
    LDR r0, LONG_MAX @ this is probably wrong, how to do it correctly?
    BX lr @ return with max value

最後から2行目、正しくロードする方法がわかりません。どこかで読んだことを漠然と覚えています。.globalでLONG_MAXを定義する必要がありましたが、実際の例へのリンクが見つかりません。

私はarm-linux-gnueabi-gccバージョン4.3.2でコンパイルしています

==================

更新:提案に感謝します!残念ながら、私はまだ構文に問題があります。

まず、小さなヘッダーファイルmylimits.hを作成しました(今のところ.Sと同じディレクトリにあります)

#define MY_LONG_MIN 0x80000000

my_arm.Sに次を追加しました:

...
.include "mylimits.h"
...
ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000
...

このアプローチには2つの問題があります。

最初の最大の問題:シンボルMY_LONG_MINが認識されない...したがって、何かがまだ正しくない

2番目:.includeの構文では、インクルードできません。mylimits.h<limits.h>に追加する必要がありますが、少し厄介なようですが、大丈夫だと思います:)

ポインタはありますか?

ARMシステム開発者ガイドシステムソフトウェアの設計と最適化[2004]およびARMアーキテクチャリファレンスマニュアル[2000]にアクセスできますが、ターゲットはXScale-IXP42xファミリrev 2(v5l)です。

4

5 に答える 5

11

多くの場合、小文字のファイル拡張子.sは、アセンブラーが c プリプロセッサーを介して渡されるべきではないことを意味しますが、大文字の拡張子は、アセンブラーが渡されるべきで.Sあることを意味します。ただし、この規則に従うかどうかはコンパイラ次第なので (gcc ポートは通常そうします)、ドキュメントを確認してください。

(編集: これは #include ディレクティブを使用できることを意味することに注意してください。ただし、インクルードするファイルのほとんどは、通常は有効なアセンブラーではないことを覚えておいてください (完全に#defineイションで構成されている場合を除く)。したがって、独自のヘッダーを作成する必要がある場合があります。 )


5年後に編集:

armcc v5 コンパイラは、Linux ではこの動作に従いますが、Windows ではそうではないことに注意してください。

于 2010-06-19T15:46:18.603 に答える
2

gcc とそのアセンブラを使用している場合は、簡単です。ファイルに final という名前を付けて.Sから、先頭に追加し#include <limits.h>、定数が必要な場所で使用しますldr r0, SOMETHING。私が持っているものなのでx86でテストを行いましたが、gcc機能であるため同じように機能します。

于 2010-07-02T15:31:17.417 に答える
1

私がやったことはこれです:

my_main.c で

#include <limits.h>
...
int my_LONG_MAX=LONG_MAX;

次に my_arm.S で

ldr r8, =my_LONG_MAX 
ldr r10, [r8] 

それは複雑に見えますが、そうです(さらに、このアプローチでは移植性の向上には疑問があります)。

アセンブリで LONG_MAX に直接アクセスする方法が必要です。そのような方法で、私は完全な答えとして喜んで受け入れます。

于 2010-06-28T13:17:38.997 に答える
0

アセンブラソースとガスをgccに供給するだけで、アセンブラでCのようなことができるようになるのを見てきました。gcc をガスのフロントエンドとして使用して何かを機能させなければならない状況に出くわすと、実際には少し怖いですが、それは別の話です。

于 2010-06-20T03:11:22.673 に答える