กลับไปหน้าบทความ

อ่าน 7 นาที

NOP (รหัส)

ใน วิทยาการคอมพิวเตอร์ NOP ( no-op หรือ NOOP ออกเสียงว่า "no op" ย่อมาจาก no operation ) คือ คำสั่ง ในภาษาเครื่อง และตัวย่อ ใน ภาษาแอสเซมบลี คำ สั่ง ในภาษาโปรแกรม หรือ คำสั่ง...

NOP (รหัส)

ในวิทยาการคอมพิวเตอร์ NOP ( no-opหรือNOOPออกเสียงว่า "no op" ย่อมาจากno operation ) คือ คำสั่ง ในภาษาเครื่องและตัวย่อ ใน ภาษาแอสเซมบลีคำ สั่ง ในภาษาโปรแกรมหรือ คำสั่ง โปรโตคอลคอมพิวเตอร์ที่ไม่ทำอะไรเลย

คำสั่งภาษาเครื่อง

ชุดคำสั่งคอมพิวเตอร์บางชุดมีคำสั่งที่มีจุดประสงค์เพื่อไม่ให้เปลี่ยนแปลงสถานะของรีจิสเตอร์แฟล็กสถานะหรือหน่วยความจำ ใดๆ ที่โปรแกรมเมอร์สามารถเข้าถึงได้ คำสั่ง นี้มักใช้จำนวนรอบสัญญาณนาฬิกา ที่กำหนดไว้ในการประมวลผล ในชุดคำสั่งอื่นๆ ไม่มีคำสั่ง NOP ที่ระบุไว้อย่างชัดเจน แต่ตัวย่อ NOP ในภาษาแอสเซ ม บลีแทนคำสั่งที่ทำหน้าที่เหมือน NOP เช่น ในชุดคำสั่งSPARCsethi 0, %g0

คำสั่ง NOP จะต้องไม่เข้าถึงหน่วยความจำ เนื่องจากอาจทำให้เกิดข้อผิดพลาดเกี่ยวกับหน่วยความจำหรือข้อผิดพลาดเกี่ยวกับเพจได้

โดยทั่วไปแล้ว NOP มักใช้เพื่อวัตถุประสงค์ด้านเวลา บังคับการจัดเรียงหน่วยความจำป้องกันอันตรายใช้ช่องหน่วงเวลาการแตกสาขาทำให้คำสั่งที่มีอยู่ เช่น การกระโดด เป็นโมฆะ เป็นเป้าหมายของคำสั่ง executeหรือเป็นตัวยึดตำแหน่งที่จะถูกแทนที่ด้วยคำสั่งที่ใช้งานอยู่ในภายหลังในการพัฒนาโปรแกรม (หรือเพื่อแทนที่คำสั่งที่ถูกลบออกเมื่อการจัดระเบียบใหม่จะเป็นปัญหาหรือใช้เวลานาน) ในบางกรณี NOP อาจมีผลข้างเคียงเล็กน้อย ตัวอย่างเช่น ใน โปรเซสเซอร์ตระกูล Motorola 68000รหัสคำสั่ง NOP ทำให้เกิดการซิงโครไนซ์ของไปป์ไลน์[ 1 ]

ด้านล่างนี้คือคำสั่ง NOP สำหรับสถาปัตยกรรม CPU บางประเภท:

จากมุมมองการออกแบบฮาร์ดแวร์ พื้นที่ที่ไม่ได้แมปบนบัสส่วนใหญ่มักถูกออกแบบให้ส่งค่าศูนย์กลับมา เนื่องจาก พฤติกรรม การเลื่อน NOPมักเป็นที่ต้องการ จึงทำให้มีแนวโน้มที่จะเขียนโค้ดโดยใช้รหัสคำสั่งที่เป็นศูนย์ทั้งหมด

รหัส

ฟังก์ชันหรือลำดับของคำสั่งในภาษาโปรแกรมจะเป็นคำสั่ง NOP หรือคำสั่งว่าง หากไม่มีผลใดๆในบางบริบท ไวยากรณ์ ของบางภาษาอาจกำหนดให้ต้องใช้คำสั่งว่าง

อาดา

ในภาษา Ada คำสั่ง นี้nullทำหน้าที่เป็น NOP [ 35 ]เนื่องจากไวยากรณ์ห้ามไม่ให้คำสั่งควบคุมหรือฟังก์ชันว่างเปล่าnullคำสั่งนี้จึงต้องใช้ระบุว่าไม่จำเป็นต้องดำเนินการใดๆ (ดังนั้น หากโปรแกรมเมอร์ลืมเขียนลำดับของคำสั่ง โปรแกรมจะไม่สามารถคอมไพล์ได้)

ซี และอนุพันธ์

คำสั่ง NOP ที่ง่ายที่สุดในภาษา C คือคำสั่ง nullซึ่งก็คือเครื่องหมายเซมิโคลอนในบริบทที่ต้องการคำสั่ง

คอมไพเลอร์ภาษา C ส่วนใหญ่จะไม่สร้างโค้ดสำหรับคำสั่งที่มีค่าเป็น null ซึ่งมีเหตุผลทั้งในด้านประวัติศาสตร์และประสิทธิภาพ

  ; 

บล็อกว่าง (คำสั่งประกอบ) ก็เป็น NOP เช่นกัน และอาจอ่านง่ายกว่า แต่คอมไพเลอร์ก็จะไม่สร้างโค้ดสำหรับบล็อกนั้นอยู่ดี

 {} 

ในบางกรณี เช่น ในส่วนของฟังก์ชัน จำเป็นต้องใช้บล็อก แต่บล็อกนั้นอาจว่างเปล่าได้ ในภาษาซี คำสั่งไม่สามารถว่างเปล่าได้ คำสั่งแบบง่ายต้องลงท้ายด้วยเครื่องหมาย;เซมิโคลอน (;) ในขณะที่คำสั่งแบบซับซ้อนจะอยู่ภายใน{}วงเล็บปีกกา (;) ซึ่งไม่จำเป็นต้องมีเครื่องหมายเซมิโคลอนตามหลัง ดังนั้น ในบริบทที่จำเป็นต้องใช้คำสั่งตามหลักไวยากรณ์ จึงสามารถใช้คำสั่งว่างเปล่าดังกล่าวได้

คำสั่ง null นั้นไม่มีประโยชน์ในตัวมันเอง แต่สามารถนำไปใช้ในเชิงไวยากรณ์ได้ในบริบทที่กว้างกว่า เช่น ในบริบทของลูป:

ในขณะที่( getchar () != '\n' ) {}

หรืออีกทางเลือกหนึ่ง

ในขณะที่( getchar () != '\n' ) ;

หรือกล่าวโดยย่อ:

ในขณะที่( getchar () != '\n' );

รูปแบบสุดท้ายอาจทำให้เกิดคำเตือนกับคอมไพเลอร์บางตัวหรือตัวเลือกคอมไพเลอร์บางตัว เนื่องจากเครื่องหมายเซมิโคลอนที่วางไว้หลังวงเล็บที่ท้ายบรรทัดมักบ่งชี้ถึงจุดสิ้นสุดของนิพจน์การเรียกใช้ฟังก์ชัน

โค้ดข้างต้นจะเรียกฟังก์ชันซ้ำไปเรื่อยๆgetchar()จนกว่าจะได้อักขระ\n(ขึ้นบรรทัดใหม่) กลับมา ซึ่งโดยพื้นฐานแล้วเป็นการเลื่อนตำแหน่งการอ่านปัจจุบันของข้อมูลป้อนเข้ามาตรฐานไปยังจุดเริ่มต้นของบรรทัดถัดไปอย่างรวดเร็ว

ฟอร์ทราน

ในภาษาฟอร์ทราน คำสั่ง นี้CONTINUEใช้ในบางบริบท เช่น คำสั่งสุดท้ายในลูป DO แม้ว่าจะสามารถใช้ได้ทุกที่ และไม่มีฟังก์ชันการทำงานใดๆ

โค้ด JavaScript

ภาษาJavaScriptไม่มีคำสั่ง NOP ในตัว แต่สามารถนำไปใช้ได้หลายวิธี:

  • ใช้;คำสั่งว่าง[ 36 ]หรือคำสั่งบล็อก{}ว่างในลักษณะเดียวกับในตัวอย่างC และอนุพันธ์
  • ใช้ คำสั่ง ` undefinedor` หรือ ` nullexpression` เป็นคำสั่งที่สมบูรณ์ ( คำสั่งนิพจน์ ) เมื่อวิธีการก่อนหน้านี้ไม่ได้รับอนุญาตตามไวยากรณ์

ทางเลือกอื่น ๆ ในกรณีที่จำเป็นต้องใช้ฟังก์ชัน ได้แก่:

  • ใช้Function.prototype()ฟังก์ชันในตัวที่รับอาร์กิวเมนต์ใดๆ และส่งคืนค่าundefined; [ 37 ]
  • ใช้ฟังก์ชัน NOP ที่มีอยู่ในไลบรารีของบุคคลที่สาม —ดูรายละเอียดด้านล่าง;
  • กำหนดฟังก์ชัน NOP แบบกำหนดเอง ดังตัวอย่างต่อไปนี้ (โดยใช้ไวยากรณ์ฟังก์ชันลูกศรของ ES6 ):
const noop = () => {};

แองกูลาร์เจเอส

เฟรม เวิร์ก AngularJSมี ฟังก์ชัน angular.noopที่ไม่ทำการดำเนินการใดๆ

jQuery

ไลบรารีjQueryมีฟังก์ชันjQuery.noop()ซึ่งไม่ได้ทำอะไรเลย[ 38 ]

โลแดช

ไลบรารีLodashมีฟังก์ชัน_.noop()ที่ส่งคืนค่า undefined และไม่ทำอะไรเลย[ 39 ]

ปาสคาล

เช่นเดียวกับในภาษาซี เครื่องหมายเซมิโคลอน (;) ที่ใช้เพียงลำพังสามารถใช้เป็นคำสั่งว่างในภาษาปาสคาลได้อันที่จริง เนื่องจากข้อกำหนดของภาษา ในบล็อก BEGIN/END เครื่องหมายเซมิโคลอนเป็นตัวเลือกก่อนคำสั่ง END ดังนั้นการใช้เครื่องหมายเซมิโคลอนตรงนั้นจึงไม่จำเป็น

นอกจากนี้ บล็อกที่ประกอบด้วย <br> BEGIN END;อาจใช้เป็นตัวยึดตำแหน่งเพื่อระบุว่าไม่มีการดำเนินการใดๆ แม้ว่าจะวางไว้ภายในบล็อก BEGIN/END อื่นก็ตาม

ไพธอน

ภาษาโปรแกรม Python มีคำสั่งที่ไม่มีผลใดๆ เมื่อถูกเรียกใช้งาน จึงเรียกว่า NOP (Not Only Operation) โดยหลักแล้วใช้เพื่อตรวจสอบความถูกต้องของไวยากรณ์ เนื่องจากไวยากรณ์ของ Python นั้นไวต่อการเว้นวรรคตัวอย่างเช่น ไวยากรณ์สำหรับการกำหนดคลาสจำเป็นต้องมีบล็อกที่เว้นวรรคพร้อมตรรกะของคลาส ซึ่งจะต้องแสดงเป็น ` null` เมื่อควรจะเป็นบล็อกว่างเปล่า passpass

การเขียนสคริปต์เชลล์ (bash, zsh เป็นต้น)

คำสั่ง ' :' [โคลอน] เป็นคำสั่งภายในของเชลล์ที่มีผลคล้ายกับ "NOP" (การดำเนินการที่ไม่ทำอะไรเลย) ในทางเทคนิคแล้วมันไม่ใช่ NOP เพราะมันเปลี่ยนพารามิเตอร์พิเศษ $? (สถานะการออกของคำสั่งสุดท้าย) เป็น 0 อาจถือได้ว่าเป็นคำพ้องความหมายของคำสั่งภายในของเชลล์ 'true' และสถานะการออกของมันคือ true (0) [ 40 ] [ 41 ] [ 42 ]

ภาษามาโคร TeX (ConTeXt, LaTeX เป็นต้น)

ภาษามาโครของระบบการพิมพ์ TeX มีคำสั่ง[ 43 ] คำสั่ง นี้ไม่ได้ทำอะไรด้วยตัวเอง แต่สามารถใช้เพื่อป้องกันไม่ให้คำสั่งก่อนหน้าวิเคราะห์โทเค็นใดๆ ที่ตามมาได้[ 44 ]\relax

คำสั่งโปรโตคอล NOP

โปรโตคอลคอมพิวเตอร์หลายตัวเช่นtelnetมีคำสั่ง NOOP ที่ไคลเอ็นต์สามารถใช้เพื่อขอการตอบกลับจากเซิร์ฟเวอร์โดยไม่ต้องร้องขอการดำเนินการอื่นใด คำสั่งดังกล่าวสามารถใช้เพื่อตรวจสอบว่าการเชื่อมต่อยังคงใช้งานได้หรือเซิร์ฟเวอร์ตอบสนองหรือไม่ คำสั่ง NOOP เป็นส่วนหนึ่งของโปรโตคอลต่อไปนี้ ( นี่เป็นเพียงส่วนหนึ่ง ):

แตกต่างจากโปรโตคอลอื่นๆ ที่กล่าวมา คำสั่ง IMAP4 NOOP มีจุดประสงค์เฉพาะ คือ ช่วยให้เซิร์ฟเวอร์สามารถส่งการแจ้งเตือนที่ค้างอยู่ไปยังไคลเอ็นต์ได้

ในขณะที่เซิร์ฟเวอร์ telnetหรือFTPส่วนใหญ่จะตอบสนองต่อคำสั่ง NOOP ด้วย "OK" หรือ "+OK" โปรแกรมเมอร์บางคนได้เพิ่มการตอบสนองที่แปลกประหลาดให้กับไคลเอนต์ ตัวอย่างเช่นftpddaemon ของMINIXตอบสนองต่อ NOOP ด้วยข้อความ: [ 45 ]

ขอให้คุณโชคดีเช่นกัน! (200 NOOP!)

การแตก

NOP มักเกี่ยวข้องกับการถอดรหัสซอฟต์แวร์ที่ตรวจสอบหมายเลขซีเรียล ข้อกำหนดเฉพาะของฮาร์ดแวร์หรือซอฟต์แวร์ การมีหรือไม่มีดอง เกิลฮาร์ดแวร์ ฯลฯ ในรูปแบบของสไลด์ NOPกระบวนการนี้ทำได้โดยการเปลี่ยนแปลงฟังก์ชันและซับรูทีนเพื่อข้ามการตรวจสอบความปลอดภัยและส่งคืนค่าที่คาดหวังแทน เนื่องจากคำสั่งส่วนใหญ่ในรูทีนตรวจสอบความปลอดภัยจะไม่ถูกใช้งาน คำสั่งเหล่านั้นจะถูกแทนที่ด้วย NOP ซึ่งจะลบฟังก์ชันการรักษาความปลอดภัยของซอฟต์แวร์โดยไม่เปลี่ยนแปลงตำแหน่งของทุกอย่างที่ตามมาในไบนารี

ช่องโหว่ด้านความปลอดภัย

โอเปอเรเตอร์โค้ด NOP สามารถใช้สร้างNOP slideซึ่งช่วยให้โค้ดสามารถทำงานได้เมื่อค่าที่แน่นอนของตัวชี้คำสั่งไม่แน่นอน (เช่น เมื่อบัฟเฟอร์โอเวอร์โฟลว์ทำให้ที่อยู่ส่งคืนของฟังก์ชันบนสแต็กถูกเขียนทับ)

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=NOP_(code)&oldid=1345210299 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ NOP (รหัส)

ใน วิทยาการคอมพิวเตอร์ NOP ( no-op หรือ NOOP ออกเสียงว่า "no op" ย่อมาจาก no operation ) คือ คำสั่ง ในภาษาเครื่อง และตัวย่อ ใน ภาษาแอสเซมบลี คำ สั่ง ในภาษาโปรแกรม หรือ คำสั่ง...

คำสั่งภาษาเครื่อง

ชุดคำสั่ง คอมพิวเตอร์บางชุดมีคำสั่งที่มีจุดประสงค์เพื่อไม่ให้เปลี่ยนแปลงสถานะของ รีจิสเตอร์ แฟ ล็กสถานะ หรือ หน่วยความจำ ใดๆ ที่โปรแกรมเมอร์สามารถเข้าถึงได้ คำสั่ง นี้มักใช้จำนวน รอบสัญญาณนาฬิกา ที่กำหนดไว้ในการประมวลผล ในชุดคำสั่งอื่นๆ ไม่มีคำสั่ง NOP...

รหัส

ฟังก์ชันหรือลำดับของคำสั่งในภาษาโปรแกรมจะเป็นคำสั่ง NOP หรือคำสั่งว่าง หากไม่มีผลใดๆในบางบริบท ไวยากรณ์ ของบางภาษาอาจกำหนดให้ต้องใช้คำสั่งว่าง

อาดา

ใน ภาษา Ada คำสั่ง นี้ null ทำหน้าที่เป็น NOP [ 35 ] เนื่องจากไวยากรณ์ห้ามไม่ให้คำสั่งควบคุมหรือฟังก์ชันว่างเปล่า null คำสั่งนี้จึงต้องใช้ระบุว่าไม่จำเป็นต้องดำเนินการใดๆ (ดังนั้น หากโปรแกรมเมอร์ลืมเขียนลำดับของคำสั่ง โปรแกรมจะไม่สามารถคอมไพล์ได้)