당신이 할 수있는 LSB가 이 (앞으로 스캔 비트) bsf
를 사용하거나 더 나은 당신이 피연산자가 제로의 경우 bsf
가 정의되지 않은 데이터를 반환 할 것이라는 사실을 알고 있습니다 희망 tzcnt
를 사용하여을 설정 테스트합니다. tzcnt
로 수정되었습니다.
의 값이 인 LSB를 테스트하려면 not
을 사용하여 입력을 반전 한 다음 LSB
집합을 테스트하십시오.
tzcnt
은 (거의) 역 호환되며 bsf
보다 빠릅니다. tzcnt
는 rep bsf reg,reg
로 오래된 CPU에 의해 읽을 수 있습니다, 그러나 tzcnt는 bsf
다르게 플래그를 수정 :
bsf: ZF=0 -> input was 0.
tzcnt: ZF=0 -> output is 0, CF=0 -> input was zero.
가장 좋은 해결책은 tzcnt
를 사용하지만, 당신이 CPU가 tzcnt
을 지원하는지 테스트 한 확인하는 것입니다 (그것이 나 bsf
이 실행되고 코드가 잘못된 결과를 표시합니다.
;Intel syntax
mov eax,not(-1)
tzcnt edx,eax ;edx = 32
mov eax,[random]
not eax
tzcnt eax,eax
다른 대안은 피연산자가 0인지 테스트하고 그에 따라 조정하는 것입니다. bsf
이 올바르게 플래그를 변경하면이를 사용하여 보정 할 수 있습니다.
은 사람 : http://www.felixcloutier.com/x86/BSF.html
BSF ..... 플래그는 모든 소스 피연산자가 0이면 ZF 플래그가 1로 설정
영향; 원칙의 문제로 내가 & T의 구문을 쓰지 않는 것이
not eax
mov edx,32
bsf eax,eax
cmovz eax,edx //force result to 32 if zero inputted.
주, 당신은 적용 가능한 피연산자를 반대로해야합니다.
tzcnt
runs a lot faster than bsf
(CPU가 정의되지 않은 동작 에뮬레이션을 수행하지 않기 때문에).
'not'와 반전 한 다음 'bsf'를 사용 하시겠습니까? – Michael
@ 마이클, 안돼! 왜냐하면 **는 입력이 -1 일 때 정의되지 않은 출력을 줄 것이기 때문입니다. – Johan
@Johan : ZF가 그것을 탐지하는 데 사용될 수있는 것처럼 보입니다. – Michael