testก็เหมือนกับandยกเว้นว่ามันจะเขียนเฉพาะ FLAGS เท่านั้นโดยปล่อยให้อินพุตทั้งสองไม่ถูกแก้ไข ด้วยอินพุตที่แตกต่างกันสองอินพุตจะมีประโยชน์สำหรับการทดสอบว่าบิตบางส่วนเป็นศูนย์ทั้งหมดหรือตั้งค่าอย่างน้อยหนึ่งรายการ (เช่นtest al, 3ตั้งค่า ZF ถ้า EAX เป็นผลคูณของ 4 (และทำให้ทั้ง 2 บิตต่ำเป็นศูนย์)
test eax,eaxตั้งค่าสถานะทั้งหมดในลักษณะเดียวกับที่cmp eax, 0จะ :
- CF และ OF เคลียร์ (AND / TEST ทำเช่นนั้นเสมอการลบศูนย์จะไม่ทำให้เกิดการพกพา)
- ZF, SF และ PF ตามค่าใน EAX (
a = a&a = a-0).
(PF ตามปกติจะถูกตั้งค่าตาม 8 บิตต่ำเท่านั้น )
ยกเว้น AF ที่ล้าสมัย (แฟล็กพกพาเสริมที่ใช้โดยคำแนะนำ ASCII / BCD) ใบทดสอบมันไม่ได้กำหนดแต่CMP ชุดมัน "ตามผล" เนื่องจากการลบศูนย์ไม่สามารถทำให้เกิดการพกพาจากบิตที่ 4 ถึง 5 ได้ CMP จึงควรล้าง AF เสมอ
TEST มีขนาดเล็กกว่า (ไม่มีทันที) และบางครั้งก็เร็วกว่า (สามารถนำมาโครมาหลอมรวมเป็น uop เปรียบเทียบและแยกสาขาบน CPU มากกว่า CMP ได้ในหลายกรณี) ที่ทำให้testสำนวนที่แนะนำสำหรับการเปรียบเทียบการลงทะเบียนกับศูนย์ เป็นการเพิ่มประสิทธิภาพช่องมองภาพcmp reg,0ที่คุณสามารถใช้ได้โดยไม่คำนึงถึงความหมาย
เหตุผลทั่วไปเพียงอย่างเดียวในการใช้ CMP กับ 0 ทันทีคือเมื่อคุณต้องการเปรียบเทียบกับตัวถูกดำเนินการหน่วยความจำ ตัวอย่างเช่นcmpb $0, (%esi)เพื่อตรวจสอบการสิ้นสุดศูนย์ไบต์ที่ส่วนท้ายของสตริงสไตล์ C ที่มีความยาวโดยนัย
เพิ่ม AVX512Fkortestw k1, k2และเพิ่ม AVX512DQ / BW (Skylake-X แต่ไม่ใช่ KNL) ktestb/w/d/q k1, k2ซึ่งทำงานบน AVX512 mask register (k0..k7) แต่ยังคงตั้งค่า FLAGS ตามปกติเช่นtestเดียวกับจำนวนเต็มORหรือANDคำสั่ง (เรียงลำดับเช่น SSE4 ptestหรือ SSE ucomiss: อินพุตในโดเมน SIMD และส่งผลให้เป็นจำนวนเต็ม FLAGS)
kortestw k1,k1เป็นวิธีสำนวนในการแยกสาขา / cmovcc / setcc ตามผลการเปรียบเทียบ AVX512 แทนที่ SSE / AVX2 (v)pmovmskb/ps/pd+testหรือcmp.
การใช้ jzเทียบกับjeอาจทำให้สับสนได้
jzและjeเป็นคำสั่งเดียวกันอย่างแท้จริงนั่นคือ opcode เดียวกันในรหัสเครื่อง พวกมันทำสิ่งเดียวกัน แต่มีความหมายที่แตกต่างกันสำหรับมนุษย์แต่มีความหมายที่แตกต่างกันสำหรับมนุษย์ ตัวแยกชิ้นส่วน (และโดยทั่วไปคือเอาต์พุต asm จากคอมไพเลอร์) จะใช้เพียงตัวเดียวดังนั้นความแตกต่างทางความหมายจึงหายไป
cmp และ subตั้งค่า ZF เมื่ออินพุตทั้งสองเท่ากัน (เช่นผลการลบคือ 0) je(กระโดดถ้าเท่ากัน) เป็นคำพ้องความหมายที่เกี่ยวข้อง
test %eax,%eax/ and %eax,%eaxตั้งค่า ZF อีกครั้งเมื่อผลลัพธ์เป็นศูนย์ แต่ไม่มีการทดสอบ "ความเท่าเทียมกัน" ZF หลังการทดสอบไม่ได้บอกคุณว่าทั้งสองตัวถูกดำเนินการเท่ากันหรือไม่ ดังนั้นjz(กระโดดถ้าเป็นศูนย์) คือคำพ้องความหมายที่เกี่ยวข้อง