- อะไร
rep; nopหมายถึง? - เหมือนกับการ
pauseเรียนการสอนหรือไม่? - มันเหมือนกับ
rep nop(ไม่มีอัฒภาค) หรือไม่? nopคำสั่งง่ายๆแตกต่างกันอย่างไร?- มันทำงานแตกต่างกันในโปรเซสเซอร์ AMD และ Intel หรือไม่?
- (โบนัส) เอกสารอย่างเป็นทางการสำหรับคำแนะนำเหล่านี้อยู่ที่ไหน?
แรงจูงใจสำหรับคำถามนี้
หลังจากการสนทนาในความคิดเห็นของคำถามอื่นฉันตระหนักว่าฉันไม่รู้ว่าrep; nop;หมายความว่าอย่างไรในการประกอบ x86 (หรือ x86-64) และฉันไม่พบคำอธิบายที่ดีในเว็บ
ฉันรู้ว่านั่นrepคือคำนำหน้าซึ่งหมายถึง"ทำซ้ำคำสั่งcxครั้งต่อไป" (หรืออย่างน้อยก็คือในแอสเซมบลี x86 16 บิตเก่า) ตามนี้ตารางสรุปที่วิกิพีเดียดูเหมือนว่าrepสามารถนำมาใช้เฉพาะกับmovs, stos, cmps, lods, scas( แต่บางทีข้อ จำกัด นี้จะถูกลบออกในโปรเซสเซอร์ใหม่กว่า) ดังนั้นฉันคิดว่าrep nop(ไม่ลำไส้ใหญ่กึ่ง) จะทำซ้ำnopการดำเนินการcxครั้ง
อย่างไรก็ตามหลังจากค้นหาเพิ่มเติมฉันก็ยิ่งสับสน ดูเหมือนว่าrep; nopและpause แมปกับ opcode เดียวกันและpauseมีพฤติกรรมที่แตกต่างจากเพียงnopเล็กน้อย จดหมายเก่าบางฉบับจากปี 2548กล่าวถึงสิ่งที่แตกต่างกัน:
- “ พยายามอย่าเผาผลาญพลังงานมากเกินไป”
- "เทียบเท่ากับ 'nop' เพียงแค่เข้ารหัส 2 ไบต์"
- "มันคือเวทย์มนตร์บน intel มันเหมือนกับ 'nop แต่ปล่อยให้พี่น้อง HT คนอื่นวิ่ง'"
- "มันหยุดชั่วคราวบน intel และการขยายอย่างรวดเร็วบน Athlon"
ด้วยความคิดเห็นที่แตกต่างกันเหล่านี้ฉันไม่เข้าใจความหมายที่ถูกต้อง
มันถูกใช้ในเคอร์เนลลินุกซ์ (ทั้งบนi386และx86_64 ) พร้อมกับความคิดเห็นนี้: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */มันยังถูกใช้ใน BeRTOSด้วยความคิดเห็นเดียวกัน