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
(กระโดดถ้าเป็นศูนย์) คือคำพ้องความหมายที่เกี่ยวข้อง