付録 無駄のないプログラミングのためのレシピ集

目次へ目次へ戻る

よくある処理をどうコーディングしたら無駄を省けるかというガイドです。

アセンブラプログラミングのポイントは徹底的に無駄を省くことです。以下のような点に注意すると無駄が省けることが多いです。

試験で出題されるプログラムは極力無駄を省いてあるはずなので、このようなテクニックを覚えておくといいでしょう。

語数欄は命令の語数+データの語数です。

評価欄は以下のとおりです。
◎=基本 ○=場合によってはあり △=無駄がある ×=目的を達しない

目的 コード例 語数 評価 備考
GRをゼロクリア  XOR  GR1,GR1 1 フラグが変わる
 SUBL GR1,GR1  1 フラグが変わる (SUBAでも同じ)
 LAD  GR1,0  2 フラグを変えたくないとき
 LD   GR1,=0  2+1 リテラルの1語が無駄
 LD   GR1,0    × 0ではなくて0番地の内容がロードされてしまう
GRに定数をロード  LAD  GR1,1  2  
 LD   GR1.=1  2+1 リテラルの一語が無駄
 LD,  GR1,1    × 1ではなくて1番地の内容がロードされてしまう
GRに定数を加減算  LAD  GR1,1,GR1  2 フラグは不変、GR0には使えない
 ADDL GR1,=1  2+1 フラグを設定したいとき、GR0のとき
 ADDL GR1,1  × 1ではなくて1番地の内容を加算してしまう
GRを0と比較  OR   GR1,GR1  1 (AND,またはLDでも同じ)
 CPA  GR1,=0  2+1 命令とリテラルの2語が無駄
 CPA  GR1,0    × 0とではなくて0番地の内容と比較してしまう
メモリ内の語と0を比較  LD   GR1,LABEL   比較命令を書かなくてもレジスタにロードすればフラグがセットされるので正・負・ゼロ・非ゼロの判定が可能
GRが0〜n(正)の範囲内か調べる  CPL  GR1,=n
 JPL  範囲外 
4+1 符号付きの数でもCPLを使えば0と比べる必要がない
(負の数は符号なしで見ると#8000より大きい数になるから範囲外になる)
GR1とGR2の値を交換  LD   GR3,GR1
 LD   GR1,GR2
 LD   GR2,GR3 
3 壊していいレジスタがあるとき
 XOR  GR1,GR2
 XOR  GR2,GR1
 XOR  GR1,GR2 
3 壊していいレジスタがないときの小技
(なぜこれで交換できるのか考えてみてください)
 PUSH 0,GR3
 LD   GR3,GR1
 LD   GR1,GR2
 LD   GR2,GR3
 POP  GR3 
6  
 PUSH 0,GR1
 PUSH 0,GR2
 POP  GR1
 POP  GR2 
6 メモリアクセスが多い
 LD   GR1,GR2 
 LD   GR2,GR1
  ×  
符号なし左1ビットシフト  ADDL GR1,GR1 1 フラグの立ち方も含めて「SLL GR1,1」命令と互換
 SLL  GR1,1  2 実は加算命令のほうが短い