test
giống như and
, ngoại trừ nó chỉ viết CỜ, để lại cả hai đầu vào của nó không được sửa đổi. Với hai đầu vào khác nhau , nó hữu ích để kiểm tra nếu một số bit đều bằng 0 hoặc nếu ít nhất một bit được đặt. (ví dụ test al, 3
đặt ZF nếu EAX là bội số của 4 (và do đó có cả 2 bit thấp của nó được làm 0).
test eax,eax
đặt tất cả các cờ theo cùng một cách cmp eax, 0
sẽ :
- CF và OF được xóa (AND / TEST luôn làm điều đó; trừ đi số 0 không bao giờ tạo ra lỗ)
- ZF, SF và PF theo giá trị trong EAX. (
a = a&a = a-0
).
(PF như bình thường chỉ được đặt theo 8 bit thấp )
Ngoại trừ AF lỗi thời (cờ mang phụ trợ, được sử dụng bởi lệnh ASCII / BCD). TEST không xác định nó , nhưng CMP đặt nó "theo kết quả" . Vì trừ đi số 0 không thể tạo ra chuyển động từ bit thứ 4 đến thứ 5, nên CMP phải luôn xóa AF.
TEST nhỏ hơn (không có ngay lập tức) và đôi khi nhanh hơn (có thể kết hợp macro thành uop so sánh và phân nhánh trên nhiều CPU hơn trong nhiều trường hợp hơn CMP). Điều đó làm cho test
thành ngữ được ưa thích để so sánh một thanh ghi với số không . Đó là một tối ưu hóa lỗ nhìn trộm chocmp reg,0
mà bạn có thể sử dụng bất kể ý nghĩa ngữ nghĩa.
Lý do phổ biến duy nhất để sử dụng CMP với số 0 ngay lập tức là khi bạn muốn so sánh với toán hạng bộ nhớ. Ví dụ: cmpb $0, (%esi)
để kiểm tra một byte 0 kết thúc ở cuối chuỗi kiểu C có độ dài ngầm định.
AVX512F thêmkortestw k1, k2
và thêm AVX512DQ / BW (Skylake-X nhưng không phải KNL) ktestb/w/d/q k1, k2
, hoạt động trên thanh ghi mặt nạ AVX512 (k0..k7) nhưng vẫn đặt CỜ thông thường như test
hiện tại, giống như cách mà số nguyên OR
hoặc AND
hướng dẫn làm. (Sắp xếp như SSE4 ptest
hoặc SSE ucomiss
: đầu vào trong miền SIMD và kết quả là CỜ số nguyên.)
kortestw k1,k1
là cách thành ngữ để rẽ nhánh / cmovcc / setcc dựa trên kết quả so sánh AVX512, thay thế SSE / AVX2 (v)pmovmskb/ps/pd
+ test
hoặc cmp
.
Việc sử dụng jz
so với je
có thể gây nhầm lẫn.
jz
và je
theo nghĩa đen là cùng một chỉ dẫn , tức là cùng một opcode trong mã máy. Chúng làm điều tương tự, nhưng có ý nghĩa ngữ nghĩa khác nhau đối với con người . Các trình giải mã (và thường là đầu ra asm từ trình biên dịch) sẽ chỉ sử dụng một, do đó, sự phân biệt ngữ nghĩa bị mất.
cmp
và sub
đặt ZF khi hai đầu vào của chúng bằng nhau (tức là kết quả phép trừ là 0). je
(nhảy nếu bằng nhau) là từ đồng nghĩa có liên quan về mặt ngữ nghĩa.
test %eax,%eax
/ and %eax,%eax
lại đặt ZF khi kết quả bằng 0, nhưng không có thử nghiệm "bình đẳng". ZF sau khi kiểm tra không cho bạn biết liệu hai toán hạng có bằng nhau hay không. Vì vậy, jz
(nhảy nếu không) là từ đồng nghĩa có liên quan về mặt ngữ nghĩa.