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)です。