test
and
FLAGS 만 작성하고 두 입력을 수정하지 않은 상태로 두는 것을 제외하면 과 같습니다 . 두 개의 다른 입력을 사용 하면 일부 비트가 모두 0인지 또는 적어도 하나가 설정되었는지 테스트하는 데 유용합니다. (예 : test al, 3
EAX가 4의 배수 인 경우 ZF를 설정합니다 (따라서 하위 2 비트가 모두 0이 됨).
test eax,eax
모든 플래그를 정확히 같은 방식으로 설정하는 cmp eax, 0
것을 :
- CF 및 OF 지워짐 (AND / TEST는 항상 그렇게하므로 0을 빼도 캐리가 생성되지 않음)
- EAX의 값에 따라 ZF, SF 및 PF. (
a = a&a = a-0
).
(평상시처럼 PF 는 하위 8 비트에 따라 설정됩니다. )
더 이상 사용되지 않는 AF (ASCII / BCD 명령어에서 사용되는 보조 운반 플래그)는 예외입니다. TEST는 정의되지 않은 상태 로 두지 만 CMP는 "결과에 따라"설정합니다 . 0을 빼면 4 번째에서 5 번째 비트까지 캐리가 생성되지 않으므로 CMP는 항상 AF를 지워야합니다.
TEST는 더 작고 (즉시 없음) 때로는 더 빠릅니다 (CMP보다 더 많은 경우에 더 많은 CPU에서 비교 및 분기 uop에 매크로 융합 가능). 이것은 test
레지스터를 0과 비교할 때 선호하는 관용구가됩니다 . 틈새 최적화입니다.cmp reg,0
의미 론적 의미에 관계없이 사용할 수 .
즉치 0과 함께 CMP를 사용하는 유일한 일반적인 이유는 메모리 피연산자와 비교하려는 경우입니다. 예를 들어, cmpb $0, (%esi)
암시 적 길이 C 스타일 문자열의 끝에서 끝나는 0 바이트를 확인합니다.
AVX512F는 추가kortestw k1, k2
하고 AVX512DQ / BW (KNL이 아닌 Skylake-X) add ktestb/w/d/q k1, k2
는 AVX512 마스크 레지스터 (k0..k7)에서 작동하지만 test
정수 OR
또는 AND
명령어 와 동일한 방식으로 일반 FLAGS를 설정 합니다. (SSE4 ptest
또는 SSE 와 비슷한 종류 ucomiss
: SIMD 도메인에 입력하고 정수 FLAGS가됩니다.)
kortestw k1,k1
AVX512 비교 결과를 기반으로 / cmovcc / setcc를 분기하는 관용적 방법으로 SSE / AVX2 (v)pmovmskb/ps/pd
+ test
또는 cmp
.
jz
vs. 사용은 je
혼란 스러울 수 있습니다.
jz
그리고 je
말 그대로 동일한 명령이다 , 기계 코드에서 동일한 연산 코드를 즉. 그들은 같은 일을하지만 인간에게는 다른 의미 론적 의미를 가지고 있습니다 . 디스어셈블러 (및 일반적으로 컴파일러의 asm 출력)는 하나만 사용하므로 의미 구분이 손실됩니다.
cmp
sub
두 입력이 같을 때 ZF 를 설정합니다 (즉, 뺄셈 결과가 0). je
(같으면 점프)는 의미 상 관련있는 동의어입니다.
test %eax,%eax
/ and %eax,%eax
결과가 0 일 때 다시 ZF를 설정하지만 "동등"테스트가 없습니다. 테스트 후 ZF는 두 피연산자가 같은지 여부를 알려주지 않습니다. 따라서 jz
(0이면 점프)는 의미 상 관련있는 동의어입니다.