<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE document PUBLIC "-//CNX//DTD CNXML 0.5 plus MathML//EN" "http://cnx.rice.edu/cnxml/0.5/DTD/cnxml_mathml.dtd">
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:bib="http://bibtexml.sf.net/" id="m10022">
  
  <name>FIR Filtering: Basic Assembly Exercise for TI TMS320C54x (Japanese - 日本語)</name>

  <metadata>
  <md:version>1.4</md:version>
  <md:created>2004/04/10 13:07:37 GMT-5</md:created>
  <md:revised>2005/08/17 16:41:56.743 GMT-5</md:revised>
  <md:authorlist>
      <md:author id="dljones">
      <md:firstname>Douglas</md:firstname>
      <md:othername>L.</md:othername>
      <md:surname>Jones</md:surname>
      <md:email>dl-jones@uiuc.edu</md:email>
    </md:author>
      <md:author id="appadwed">
      <md:firstname>Swaroop</md:firstname>
      
      <md:surname>Appadwedula</md:surname>
      <md:email>appadwed@uiuc.edu</md:email>
    </md:author>
      <md:author id="mjberry">
      <md:firstname>Matthew</md:firstname>
      <md:othername>J.</md:othername>
      <md:surname>Berry</md:surname>
      <md:email>mjberry@uiuc.edu</md:email>
    </md:author>
      <md:author id="markhaun">
      <md:firstname>Mark</md:firstname>
      <md:othername>A.</md:othername>
      <md:surname>Haun</md:surname>
      <md:email>markhaun@uiuc.edu</md:email>
    </md:author>
      <md:author id="jake">
      <md:firstname>Jake</md:firstname>
      
      <md:surname>Janevitz</md:surname>
      <md:email>jake@janovetz.com</md:email>
    </md:author>
      <md:author id="kramer">
      <md:firstname>Michael</md:firstname>
      <md:othername>L.</md:othername>
      <md:surname>Kramer</md:surname>
      <md:email>kramer@ifp.uiuc.edu</md:email>
    </md:author>
      <md:author id="moussa">
      <md:firstname>Dima</md:firstname>
      
      <md:surname>Moussa</md:surname>
      <md:email>dmoussa@uiuc.edu</md:email>
    </md:author>
      <md:author id="dsachs">
      <md:firstname>Daniel</md:firstname>
      <md:othername>Grobe</md:othername>
      <md:surname>Sachs</md:surname>
      <md:email>sachs@uiuc.edu</md:email>
    </md:author>
      <md:author id="bwade">
      <md:firstname>Brian</md:firstname>
      
      <md:surname>Wade</md:surname>
      <md:email>bwade@uiuc.edu</md:email>
    </md:author>
      <md:author id="jpfrantz">
      <md:firstname>Patrick</md:firstname>
      
      <md:surname>Frantz</md:surname>
      <md:email>jpfrantz@rice.edu</md:email>
    </md:author>
      <md:author id="emi">
      <md:firstname>Emiko</md:firstname>
      
      <md:surname>Yamai</md:surname>
      <md:email>eyamai@hotmail.com</md:email>
    </md:author>
      <md:author id="takaryo">
      <md:firstname>Hironori</md:firstname>
      
      <md:surname>Takaryo</md:surname>
      <md:email>s043105@ishikawa-nct.ac.jp</md:email>
    </md:author>
      <md:author id="yyama">
      <md:firstname>Yoji</md:firstname>
      
      <md:surname>Yamada</md:surname>
      <md:email>yyama@ishikawa-nct.ac.jp</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="jpfrantz">
      <md:firstname>Patrick</md:firstname>
      
      <md:surname>Frantz</md:surname>
      <md:email>jpfrantz@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="emi">
      <md:firstname>Emiko</md:firstname>
      
      <md:surname>Yamai</md:surname>
      <md:email>eyamai@hotmail.com</md:email>
    </md:maintainer>
    <md:maintainer id="takaryo">
      <md:firstname>Hironori</md:firstname>
      
      <md:surname>Takaryo</md:surname>
      <md:email>s043105@ishikawa-nct.ac.jp</md:email>
    </md:maintainer>
    <md:maintainer id="yyama">
      <md:firstname>Yoji</md:firstname>
      
      <md:surname>Yamada</md:surname>
      <md:email>yyama@ishikawa-nct.ac.jp</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  <md:keywordlist>
    <md:keyword>assembly</md:keyword>
    <md:keyword>DSP</md:keyword>
    <md:keyword>fractional arithmetic</md:keyword>
    <md:keyword>hexadecimal</md:keyword>
    <md:keyword>mac</md:keyword>
    <md:keyword>rptz</md:keyword>
    <md:keyword>stl</md:keyword>
    <md:keyword>two's-compliment</md:keyword>
  </md:keywordlist>

  <md:abstract>TI社 TMS320C54x アセンブリコードを手作業により学びます。ここで扱う命令セットには、２の補数表現を利用した固定小数点表現での乗算を含みます。</md:abstract>
</metadata>



  
  <content>
    <section id="sec1">
      <name>アセンブリ演習</name>
      <para id="p1">　下記のコード例を分析して下さい。不明な点は<cnxn document="m10808">Two's Complement and Fractional Arithmetic
	for 16-bit Processors</cnxn>, <cnxn document="m10806">Addressing Modes for TI TMS320C54x</cnxn>
	および <cite src="http://www-s.ti.com/sc/psheets/spru172c/spru172c.pdf">Mnemonic
	Instruction Set</cite>を参照して下さい。
      </para>
      <code type="block">
	<![CDATA[
	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
	]]>
      </code>
      <para id="p2">　"<code>;</code>"から始まる行は全てコメントです。この例でのコメントは、11行目に示した最初の命令文<code>stl</code>を実行する前の段階での補助レジスタ<code>BK</code>の値とアドレスレジスタ<code>AR0</code>,<code>AR2</code>, 及び <code>AR3</code>の内容を示しています。1行めの<code>FIR_len .set    3</code>という文は、<code>FIR_len</code>という文字列が3に等しいということを定義しています(訳注：C言語の#define文と同等です）。<code>BK</code>レジスタの値は、このコード例で使用したいサーキュラー・バッファの長さを示しています。記号<code>%</code>は、インクリメント演算子<code>+</code>を修飾しており、これによりサーキュラー・バッファを実現しています。すなわち、メモリアドレスを<code>BK</code>レジスタの値で除算した剰余がゼロになるまでアドレスレジスタがインクリメントする、ということです。インクリメント演算子<code>+</code>の次に<code>0</code>を置いた場合、レジスタ<code>AR0</code>が指定する値までインクリメントするという動作になります。

注意：<code>h</code>が末尾に付いている数および<code>0x</code>で始まる数は、<term>16進数</term>の値を表しています。
      </para>
      <example id="example1">
	<para id="p2b">
1000hと0x1000は、両方とも10進数の4096を表しています。
</para>
      </example>
      <para id="p3">　データメモリは<code>1000h</code>番地から始まり、下記のよに初期化されていると仮定します。
      </para>
      <figure id="tab1fig">
	<media type="image/png" src="reg1.png"/>
	<caption>データメモリの内容(実行前)</caption> 
      </figure>
      <para id="p3b">　まず<code>stl</code>,<code>rptz</code>, 及び <code>mac</code>命令を各自で理解してから、コード例を一行ずつ実行したときのアキュムレータ<code>A</code>および補助レジスタ<code>AR2</code>、<code>AR3</code>の値を<cnxn target="table2fig"/>の空欄に記入して下さい。さらに、3行のコードをすべて実行した後でのメモリの内容を<cnxn target="table3fig"/>の空欄に記入して下さい。
      </para>
      <figure id="table2fig">
	<table id="table2" frame="all">
	  <tgroup cols="4">
	    <thead>
	      <row>
		<entry>A</entry>
		<entry>AR2</entry>
		<entry>AR3</entry>
		<entry/>
	      </row>
	    </thead>
	    <tbody>
	      <row>
		<entry><code>00 0000 8000h</code></entry>
		<entry><code>1000h</code></entry>
		<entry><code>1004h</code></entry>
		<entry>at start of code</entry>
	      </row>
	      <row>
		<entry/>
		<entry/>
		<entry/>
		<entry>after <code>stl</code> instruction</entry>
	      </row>
	      <row>
		<entry/>
		<entry/>
		<entry/>
		<entry>after <code>rptz</code> instruction</entry>
	      </row>
	      <row>
		<entry/>
		<entry/>
		<entry/>
		<entry>after first <code>mac</code> instruction</entry>
	      </row>
	      <row>
		<entry/>
		<entry/>
		<entry/>
		<entry>
		  after second <code>mac</code> instruction
		</entry>
	      </row>
	      <row>
		<entry/>
		<entry/>
		<entry/>
		<entry>after third <code>mac</code> instruction</entry>
	      </row>
	    </tbody>
	  </tgroup>
	</table>
	<caption>実行結果</caption>
      </figure>
      <para id="p4">　この演習を行う際、アキュムレーター<code>A</code>が40ビットレジスタであることや、乗算が<term>固定小数点演算モード</term>であることを考慮に入れてください。このモードでは、DSP上での整数は分数(いわゆるQフォーマットの小数)として解釈され、また乗算器もそのように扱うでしょう。このような扱いは、ALU内の整数の乗算結果を1ビット左シフトすることによりなされます(ここに示すすべての例では、すべての演算は固定小数点演算であると仮定します)。したがって、<code>mac</code>命令によりALUによって実行される乗算結果は、単に２つの整数を乗算したときの結果の２倍の値となります。DSPにおける数値表現および演算は、<cnxn document="m10808">Two's Complement and Fractional Arithmetic for 16-bit Processors</cnxn>という文書にさらに詳しく記述されていますので、適宜参照して下さい。
      </para>
      <figure id="table3fig">
	<media type="image/png" src="reg2.png"/> 
	<caption>データメモリの内容(実行後)</caption>
      </figure>
    </section>
  </content>
</document>
