AL
의 비트 0, 3, 6, 7이 모두 이거나 TEST
명령인지 확인하고 싶습니다.TEST를 사용하여 AL의 여러 비트가 모두 0이거나 모두 1인지 확인하십시오.
TEST AL,1
하지만 어떻게 함께 비트 0, 3, 6, 7을 확인할 수 있습니다
나는이 코드와 비트 0을 확인하실 수 있습니다 알아?
AL
의 비트 0, 3, 6, 7이 모두 이거나 TEST
명령인지 확인하고 싶습니다.TEST를 사용하여 AL의 여러 비트가 모두 0이거나 모두 1인지 확인하십시오.
TEST AL,1
하지만 어떻게 함께 비트 0, 3, 6, 7을 확인할 수 있습니다
나는이 코드와 비트 0을 확인하실 수 있습니다 알아?
귀하의 제목은 신체에서 정반대의 질문을하고 있습니다. 단일 비트의 경우 거의 동일합니다 (test al,1<<bit_position
/jz
또는 jnz
). 그러나 여러 비트를 테스트해야 할 때 실제로는 다른 문제입니다. AND 연산의 결과가 0 그래서 당신이보고 싶을 비트를 마스크하고, ZF를 확인할 때 test
는 ZF를 설정하기 때문에
jz
또는
jnz
또는
setz/nz al
또는
cmovz/nz ecx, edx
일 수 있음을 기억하십시오.
test al, mask
jz all_bits_selected_by_mask_were_zero
;; fall through path: at least one non-zero bit
이
모두 하나의를 확인하려면, 일반적인 관용구
x & mask == mask
입니다.
and
및
cmp
에 대해 상수가 두 번 필요하기 때문에 이것은 asm에서 이상적이지 않습니다. 다른 방법은 모든 비트를 반전 한 다음 앞의 방법으로 0을 확인하는 것입니다.
not al
test al, mask
jz all_bits_selected_by_mask_were_one
;; fall through path: at least one unset bit
;;; or if mask has only a single bit set:
test al, single_bit_mask
jnz the_bit_was_set
또 다른 최적화 (이 레지스터 AL에 비해 다른에 대한 코드 바이트를 저장하지만 대부분의 지침은 특별한 2 바이트 인코딩은 op al, imm8
에있다) : 당신은 제 2의 모든 일부 비트를 테스트해야하는 경우 EAX의 1 바이트를 사용하면 코드 바이트가 ah
이지만 this adds a cycle of latency on Haswell/Skylake으로 저장됩니다.
예 : test eax, 3<<8
대 test ah, 3
. 단일 비트를 들어
bt eax, 11
시험은 그러나
bt
수없는 매크로 퓨즈 (11)가 (당신이 당신이 비트를 타고 다른 곳. 추가하려는 경우
adc edx, 0
처럼 재미있는 물건을 할 수 있도록 설정/CF를 삭제) 비트 JCC이므로
test eax, imm32
이 더 효율적입니다. 어느 경우
는, 마스크는 경우에 1<<0 | 1<<3 | 1<<6 | 1<<7
입니다. 주어진 위치의 비트가 나타내는 숫자는 1<<n
이며, 어셈블러 상수는 숫자로 지정됩니다. 물론
, 당신은 (예를 들어, NASM에 b
접미사를 사용하여) 진 상수를 쓸 수 있습니다, 그래서 당신은 test al, 11001001b
을 할 수 있습니다.
해당 비트 중 _all_가 설정되어 있는지 확인하려면 'AND'와'CMP'가 필요합니다. 적어도 하나의 비트가 설정되어 있는지 확인하고 싶다면'TEST'를 사용할 수 있습니다. – Michael
@Michael :'al al' /'test al, xxx' /'jz' 또한 당신이 반전 한 후에 모든 비트가 0인지 점검 할 수 있습니다. ('not'는 즉시를 필요로하지 않기 때문에)'al' 이외의 레지스터에 대해 1 바이트의 코드 크기를 저장합니다. –