test
은 모두 과 비슷하지만 FLAGS 만 쓰고 나머지 입력은 모두 수정되지 않습니다. 두 개의 입력이 다른 인 경우 일부 비트가 모두 0이거나 하나 이상 설정되어 있는지 테스트하는 데 유용합니다. (예 :test al, 3
은 EAX가 4의 배수이면 (따라서 낮은 2 비트가 모두 0 인 경우) ZF를 설정합니다.
test eax,eax
세트의 모든 플래그 정확히 cmp eax, 0
것하는 것과 같은 방법 :
- CF 및 클리어는 (AND/TEST는 항상 그 수행하고, 영을 빼는 것은 결코 캐리 생산 없음)
- 을 ZF, SF 및 PF를 EAX의 값에 따라 계산합니다. (
a = a&a = a-0
) (ASCII/BCD 명령에 의해 사용되지 않는 AF (보조 캐리 플래그).
TEST leaves it undefined 제외
하지만 CMP sets it "according to the result". 5 비트 4에서 캐리를 생성 할 수 제로를 감산하기 때문에, CMP는 항상 AF를 제거해야합니다).
TEST가 작은 (즉각적인) 때로는 빠르게 (CMP보다 더 많은 경우에 이상의 CPU에 대한 비교 및 분기의 UOP에 할 수있는 매크로 퓨즈). That makes test
the preferred idiom for testing a register for zero or not.
즉시 0으로 CMP를 사용하는 가장 일반적인 이유는 메모리 피연산자와 비교할 때입니다 (예 : cmpb $0, (%esi)
은 암시 적 길이의 C 스타일 문자열 끝에 0 바이트가 종료되는지 확인) .
AVX512F는 test
이하는 것처럼 AVX512 마스크 레지스터 (k0..k7)하지만 여전히 설정 일반 FLAGS에서 작동 ktestb/w/d/q k1, k2
, 같은 방법으로 추가 kortestw k1, k2
을 추가하고 AVX512DQ/BW (스카이 레이크하지만 KNL) 그 정수 OR
또는 AND
지침을 참조하십시오.
kortestw k1,k1
는 SSE/AVX2에게 (v)pmovmskb/ps/pd
+ test
cmp
또는 교체, 비교 결과에 기초 AVX512/cmovcc/setcc를 분기하는 관용적 인 방법이다.
이용 jz
대 je
는 혼란 스러울 수 있습니다.
jz
and je
are literally the same instruction, 즉 기계 코드의 opcode입니다. 그들은 똑같은 일을하지만 인간에 대해서는 다른 의미 론적 의미를 가지고있다.. 디스어셈블러 (일반적으로 컴파일러의 asm 출력)는 오직 하나만 사용하므로 의미를 구분하지 못합니다.
cmp
및 sub
은 두 입력이 동일 할 때 (즉, 감산 결과가 0 일 때) ZF로 설정됩니다. je
(동일하면 점프)은 의미 적으로 관련된 동의어입니다.
test %eax,%eax
/and %eax,%eax
은 결과가 0 일 때 ZF를 다시 설정하지만 "동등성"테스트는 없습니다. 테스트 후 ZF는 두 피연산자가 같은지 여부를 알려주지 않습니다. 따라서 jz
(0으로 점프)은 의미 적으로 관련된 동의어입니다.
나는이 일반적인 대답을 "이 테스트의 목적은 무엇이며, CMP와 다른 점은 무엇인가"에 대한 더 나은 정식 답변으로 바꾸기 위해 편집했습니다. 동의어 JE와 JZ의 의미 론적 의미에 대한 의견을 보려면 내 대답을 참조하십시오. 꽤 편집 적이기 때문에 편집을 검토하십시오. 여전히 답변입니다. –
@PeterCordes 의도를 고맙게 생각하지만 편집을 취소하겠습니다. 1. 당신의 "목소리"는 내 것과 매우 다르며, 지금은 내 대답보다 훨씬 더 많이 읽습니다. 2. 문제는 플래그가'test'와'cmp' 사이에서 똑같은 방식으로 나오게된다는 대담한 주장입니다. 예, 코디에 대한 귀하의 의견에 근거한 귀하의 신념입니다. 그러나 그것을 내 게시물에 넣는 것은 다른 문제입니다. 그것은 모든 경우에 동일하다는 것을 알지 못하기 때문에 내가 서서 기꺼이 주장하는 주장이 아닙니다. –
@PeterCordes "정식"답변을 원한다는 것을 이해합니다. 그러나 대답은 허용 된 답변에 피기 백하기보다는 자신의 장점으로 수영하거나 가라 앉혀 야한다고 생각합니다. 나는 [부동 소수점 입문서] (http://stackoverflow.com/a/27030789/13)와 같이 아주 대중적인 질문에 대한 나의 대답을 위해 그렇게해야만했다. 응답은 이미 500+ upvotes에 다른 응답이 있었다. –