UNI のプロジェクトを行っていますが、問題があります。
サブルーチンを呼び出すときにレジスタをスタックにプッシュ/ポップする方法を学習しています。
10 進数 0 ~ 15 を対応する 16 進数 ASCII コードに変換するサブルーチンを作成しr0
、結果を格納する必要がある を除くすべてのレジスタの値を保持する必要があります。私は ASCII コードのテーブルを持っています。基本的にnumber*4
は、ASCII テーブルの開始アドレスに を追加し、値を に戻しますr0
。
正しい結果が得られますが、サブルーチンがループします。無限ldmfd
に飛び続けます。sub
理由はありますか?
main:
adr r0,num
adr r1,ascii
ldr r2,[r0]
bl sub
sub: stmfd sp!,{r1-r2,lr}
ldr r0,[r1,r2,LSL #2]
ldmfd sp!,{r1-r2,pc}
/* variables here */
num: .word 15
ascii: .word 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46
/* end variables */