2017-11-29 2 views
3

AL의 비트 0, 3, 6, 7이 모두 이거나 TEST 명령인지 확인하고 싶습니다.TEST를 사용하여 AL의 여러 비트가 모두 0이거나 모두 1인지 확인하십시오.

TEST AL,1 

하지만 어떻게 함께 비트 0, 3, 6, 7을 확인할 수 있습니다

나는이 코드와 비트 0을 확인하실 수 있습니다 알아?

+3

해당 비트 중 _all_가 설정되어 있는지 확인하려면 'AND'와'CMP'가 필요합니다. 적어도 하나의 비트가 설정되어 있는지 확인하고 싶다면'TEST'를 사용할 수 있습니다. – Michael

+3

@Michael :'al al' /'test al, xxx' /'jz' 또한 당신이 반전 한 후에 모든 비트가 0인지 점검 할 수 있습니다. ('not'는 즉시를 필요로하지 않기 때문에)'al' 이외의 레지스터에 대해 1 바이트의 코드 크기를 저장합니다. –

답변

2

귀하의 제목은 신체에서 정반대의 질문을하고 있습니다. 단일 비트의 경우 거의 동일합니다 (test al,1<<bit_position/jz 또는 jnz). 그러나 여러 비트를 테스트해야 할 때 실제로는 다른 문제입니다. AND 연산의 결과가 0 그래서 당신이보고 싶을 비트를 마스크하고, ZF를 확인할 때 test는 ZF를 설정하기 때문에

모두 0를 확인하려면, 그것은 여전히 ​​쉽습니다. 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입니다. andcmp에 대해 상수가 두 번 필요하기 때문에 이것은 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<<8test 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을 할 수 있습니다.

관련 문제