いくつかの基本:
ほとんど(すべて?)シフト命令はキャリーフラグにビットをシフトアウト
ほとんど(全て?)のCPUは、キャリーフラグのセット上の場所にジャンプし、分岐命令を持っています
これを組み合わせて、次の操作を行うことができます:
load register1,< the value to be tested >
load register2, 0
Lrepeat:
compare register1 with 0
jump if zero Lexit
shift right register1
jump no carry Lskip
increase register2
Lskip:
jump Lrepeat
Lexit: ; when you end up here, your register2
; holds the count of bit register1 had set
まだ行うことができますいくつかの最適化:
Lrepeat:
compare register1 with 0
jump if zero Lexit
shift right register1
jump no carry Lskip <-- note: here you jump ...
increase register2
Lskip:
jump Lrepeat <-- ... to jump again!
Lexit:
=====>
Lrepeat:
compare register1 with 0
jump if zero Lexit
shift right register1
jump no carry Lrepeat <-- so you can optimize it this way
increase register2
Lskip:
jump Lrepeat
Lexit:
いくつかのCPUには、「追加キャリー」インストルメントがあります( )。 6502:
ADC register,value ; register = register + value + Carry flag
これはあなたがする必要はありません各ループ
shift right register1
add with carry register2,0 ; may look weird, but this adds a
; 1 if the carry is set, which is
; exactly what we want here
jump Lrepeat
ノートをレジスタ2 0(プラスもちろんキャリー)を追加することにより、ブランチ(条件ジャンプ)を回避するために使用することができレジスタのサイズを知っている!レジスタが1になるまでループするだけで、多くの時間を節約できます。あなたの値が次のようなものなら0000 0000 0000 0000 0000 0001 1001
@Malcom McLean ANDは何をしますか?編集:質問を編集しました。私は何を尋ねるつもりだったと私は謝罪を追加しません – user3794422
2つの数字を一緒に追加します。通常は2つのレジスタです。 –
@Malcom McLean私は私のコメントを編集してください – user3794422