私は初心者です。私は、メモリARMのメモリマップを理解することが困難です。ARMアセンブリのソート
私は、単純なソートアルゴリズム
AREA ARM, CODE, READONLY
CODE32
PRESERVE8
EXPORT __sortc
; r0 = &arr[0]
; r1 = length
__sortc
stmfd sp!, {r2-r9, lr}
mov r4, r1 ; inner loop counter
mov r3, r4
sub r1, r1, #1
mov r9, r1 ; outer loop counter
outer_loop
mov r5, r0
mov r4, r3
inner_loop
ldr r6, [r5], #4
ldr r7, [r5]
cmp r7, r6
; swap without swp
strls r6, [r5]
strls r7, [r5, #-4]
subs r4, r4, #1
bne inner_loop
subs r9, r9, #1
bne outer_loop
ldmfd sp!, {r2-r9, pc}^
END
の例を発見したと、このアセンブリは、私の知る限り、このコードは上の整数の配列を作成し、理解するよう
#define MAX_ELEMENTS 10
extern void __sortc(int *, int);
int main()
{
int arr[MAX_ELEMENTS] = {5, 4, 1, 3, 2, 12, 55, 64, 77, 10};
__sortc(arr, MAX_ELEMENTS);
return 0;
}
Cコードからこの方法で呼び出されなければなりませんアセンブリに実装された_sortc
関数を呼び出します。この関数はスタックからこの値を取り出し、ソートしてスタックに戻します。私は正しい?
この例ではアセンブリのみを使用して実装することができますか? DCDは、変数を宣言整数BTW
DCD 3, 7, 2, 8, 5, 7, 2, 6
のアレイを画定例えば
は、メモリに格納されています?
このように宣言された値を使って、どのように操作できますか?どのようにスタックを使わなくても、生データだけでCコードなしでアセンブリを使用してこれを実装する方法を説明してください。私はARM7TDMI
アーキテクチャ
お返事ありがとうございます!あなたは 'READWRITE'配列の書き込みをどのようにして動作させることができ、どのように値を入れ替えるかをソートの観点から読むことができますか? – fyfdzbgz
@fyfdzbgz私はあなたがどのアセンブラを使用しているか知っていませんし、どんなプラットフォームであっても、もし私がしていても、私はアクティブなAndroid NDKの形式で 'gas'アセンブラを使っていますが、 MDK-ARMから私はそのドキュメントをリンクしています。そして、私は〜10yのARMアセンブリを作成していませんでしたが、それほど多くはありませんでした(私はGameBoy Advanceのゲームを行っていましたが、99%のコードはC++でしたが、コンパイラの出力をチェックしてコンパイラが混乱した場合過度に)。だから私は答えのいくつかの例を追加しようとしますが、私はテストせずに彼らを盲目的にやります、申し訳ありません。 – Ped7g
@fyfdzbgz私は何かを追加しましたが、あなたが求めているものの全体的なほとんどが既にオリジナルのソースにありますので、サンプルやドキュメントをもっと深く掘り下げ、数回読み返してください。すでに読んだドキュメントを体験することは、おそらくあなたが求めていることを説明するより意味をなさないかもしれません。また、デバッガが単一の命令をステッピングしてCPU状態の変化を監視し、各命令の命令リファレンスガイドと比較して、その動作の「感触」を得るのに時間を費やします。そして、それらのことを知るために、時々指示の全リストを読み返してください。 – Ped7g