ARM アセンブリを学習しているだけで、自分のコードが正しいかどうかわかりません。このコードは、音の遅延を実装することになっています。
以下の手順に従いましたが、コードにエラーがあるかどうかわかりません。
- バッファ「buf」を初期化します(初期化すると、そのレジスタはバッファの最初の要素を指します)
- バッファのサイズを 1 つのレジスタに格納する
- 入力値を正しい場所に保存していることを確認する必要があるため、インデックスr0とバッファレジスタを比較してください(r1としましょう)
- インデックス r0 が r1 より小さい場合は、r1 にします (つまり、配列の最初の要素)。
- r1 でバッファのサイズを追加します (現在、r1 は配列の最後の要素です)
- r0 と r1 を再度比較し、r0 が r1 より大きい場合は、「buf」に初期化します。
- その後、ADC値をr0にロードし、DACに保存します
- 各サンプルは 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