몇 가지 기본 :
대부분의 (모든?) 시프트 지침은 캐리 플래그로 비트를 이동
대부분의 (모든?) 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에는 "add carry"instuction이 있습니다 (예 : ). 6502 :
이 0을 추가하여, 분기 (조건 점프)를 피 (플러스 물론 수행) 각 루프 당신이 할 필요가 없습니다
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
메모를 REGISTER2하는 데 사용할 수
ADC register,value ; register = register + value + Carry flag
레지스터 크기를 아십시오! 레지스터가 1이 될 때까지 반복하면 많은 시간을 절약 할 수 있습니다. 값이 0000 0000 0000 0000 0000 0001 1001
@Malcom McLean AND는 무엇을합니까? 편집 : 나는 질문을 편집했습니다. 나는 무엇을 부탁하려고했는데 사과하지 않는다. – user3794422
두 개의 숫자를 더한다. 보통 두 개의 레지스터. –
@Malcom McLean 내 의견을 편집 해주세요. – user3794422