Summary: TI社 TMS320C54x アセンブリコードを手作業により学びます。ここで扱う命令セットには、2の補数表現を利用した固定小数点表現での乗算を含みます。
1 FIR_len .set 3
2
3 ; Assume:
4 ; BK = 3
5 ; AR0 = 1
6 ; AR2 = 1000h
7 ; AR3 = 1004h
8 ;
9 ; FRCT = 1
10
11 stl A,*AR3+%
12 rptz A,(FIR_len-1)
13 mac *AR2+0%,*AR3+0%,A
;"から始まる行は全てコメントです。この例でのコメントは、11行目に示した最初の命令文stlを実行する前の段階での補助レジスタBKの値とアドレスレジスタAR0,AR2, 及び AR3の内容を示しています。1行めのFIR_len .set 3という文は、FIR_lenという文字列が3に等しいということを定義しています(訳注:C言語の#define文と同等です)。BKレジスタの値は、このコード例で使用したいサーキュラー・バッファの長さを示しています。記号%は、インクリメント演算子+を修飾しており、これによりサーキュラー・バッファを実現しています。すなわち、メモリアドレスをBKレジスタの値で除算した剰余がゼロになるまでアドレスレジスタがインクリメントする、ということです。インクリメント演算子+の次に0を置いた場合、レジスタAR0が指定する値までインクリメントするという動作になります。
注意:hが末尾に付いている数および0xで始まる数は、16進数の値を表しています。
1000h番地から始まり、下記のよに初期化されていると仮定します。
![]() 図 1: データメモリの内容(実行前) |
stl,rptz, 及び mac命令を各自で理解してから、コード例を一行ずつ実行したときのアキュムレータAおよび補助レジスタAR2、AR3の値を図 2の空欄に記入して下さい。さらに、3行のコードをすべて実行した後でのメモリの内容を図 3の空欄に記入して下さい。
図 2: 実行結果 |
Aが40ビットレジスタであることや、乗算が固定小数点演算モードであることを考慮に入れてください。このモードでは、DSP上での整数は分数(いわゆるQフォーマットの小数)として解釈され、また乗算器もそのように扱うでしょう。このような扱いは、ALU内の整数の乗算結果を1ビット左シフトすることによりなされます(ここに示すすべての例では、すべての演算は固定小数点演算であると仮定します)。したがって、mac命令によりALUによって実行される乗算結果は、単に2つの整数を乗算したときの結果の2倍の値となります。DSPにおける数値表現および演算は、Two's Complement and Fractional Arithmetic for 16-bit Processorsという文書にさらに詳しく記述されていますので、適宜参照して下さい。
![]() 図 3: データメモリの内容(実行後) |
Comments, questions, feedback, criticisms?