0

ARM アセンブリを学習しているだけで、自分のコードが正しいかどうかわかりません。このコードは、音の遅延を実装することになっています。

以下の手順に従いましたが、コードにエラーがあるかどうかわかりません。

  1. バッファ「buf」を初期化します(初期化すると、そのレジスタはバッファの最初の要素を指します)
  2. バッファのサイズを 1 つのレジスタに格納する
  3. 入力値を正しい場所に保存していることを確認する必要があるため、インデックスr0とバッファレジスタを比較してください(r1としましょう)
  4. インデックス r0 が r1 より小さい場合は、r1 にします (つまり、配列の最初の要素)。
  5. r1 でバッファのサイズを追加します (現在、r1 は配列の最後の要素です)
  6. r0 と r1 を再度比較し、r0 が r1 より大きい場合は、「buf」に初期化します。
  7. その後、ADC値をr0にロードし、DACに保存します
  8. 各サンプルは 2 つのメモリ セルを使用しているため、必ずインデックスを 2 ずつ増やしてください (STRH r0、[r1]、#2)。

.set AD0GDR,        0xE0034004

.set DACR,      0xE006C000

.set BUFLEN,10000

.bss

.balign 2

buf:.skip( 2 * BUFLEN);  //'buf' intialized

.data

.balign 2

.skip 2

.text

/**
* void delay_audio();
*/ 

.text

.balign 4

.global delay_audio

delay_audio:

LDR r2, =0xE0034004

LDR r3, =0xE006C000 


LDR r1,=buf  //Store size of buf in one register

CMP r0,r1  //Comapre Index ro and buf register 

LDRLT r0,[r1 , #0]  //if(r0<r1) then r1 is the first element in the array

LDRLT r0,[r1]   //add size of buf with r1, so r1 will become the last element

CMP r0,r1    //Compare again

LDRGT r0,=buf  //if(r0>r1)  then r1 will be initialized to buf


LDRH r0,[r2] //load from ADC to r0( r0 is index)

STRH r0,[r3] //Store the same half word in DAC

STRH r0,[r1],#2 //increment index by 2 

bx lr   // return

.end
4

0 に答える 0