1

ARM アセンブリを独学で学んでいますが、簡単なプログラムを実行することすらできません。ツールチェーンとすべてをセットアップすると、コードは問題なくコンパイルされます。ただし、 Android を搭載した Galaxy Nexus (私がテストしている唯一のプラットフォーム) で/data/local/tmp/からプログラムを実行すると、常に「Stopped (signal)」および/または「139 Segmentation fault」が発生します (通常は番号なし)。これは、C コードからアセンブリ関数を呼び出そうとした瞬間に発生します。

neotest.c:

#include <stdio.h>

void neon_test(void); // I also tried variations like extern, but no avail

int main(int argc, char* argv[]) {
    printf("\nHello World\n"); // works just fine
    neon_test(); // segmentation fault
    printf("Done!");
    return 0;
}

(neontest.h ファイルは現在空です)

neotest_neon.s:

.text // added because some wiki said so
.arch armv7a
.fpu neon
.thumb
.syntax unified

.align 4
.global neon_test
.func neon_test
neon_test:
    NOP
.endfunc

.end

これは権利の問題なのではないかと心配していますが、この時点以降の問題を適切に特定する方法さえわかりません.

4

2 に答える 2

1

適切な asm 命令を使用して関数から戻る必要があります。ARM Cortex m3 では、その bx lr 命令が、プラットフォームに適したものかどうかわかりません。

于 2013-07-23T10:15:53.820 に答える
1

ほとんどの場合に機能する解決策があります。

デバッガーを使用する

バグが発生した正確な場所が表示され、通常は何が起こったのかが多かれ少なかれ明確になります。

そうは言っても、ここにいくつかの推測があります:

  1. BX LR@hivert が言うように、確かに return ( ) を忘れていました。
  2. Thumb 関数は.thumb_func、リンカーが適切に処理できるように、 でマークする必要があります。だけ.thumbでは十分ではありません。
于 2013-07-23T09:53:17.353 に答える