よくある処理をどうコーディングしたら無駄を省けるかというガイドです。
アセンブラプログラミングのポイントは徹底的に無駄を省くことです。以下のような点に注意すると無駄が省けることが多いです。
試験で出題されるプログラムは極力無駄を省いてあるはずなので、このようなテクニックを覚えておくといいでしょう。
語数欄は命令の語数+データの語数です。
評価欄は以下のとおりです。
◎=基本 ○=場合によってはあり △=無駄がある ×=目的を達しない
目的 | コード例 | 語数 | 評価 | 備考 |
---|---|---|---|---|
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 | △ | 実は加算命令のほうが短い |