NOP (الرمز)

في علوم الحاسوب ، فإن NOP أو no-op أو NOOP (تنطق "no op"؛ اختصار لـ no operation ) هي تعليمات لغة الآلة ورمزها في لغة التجميع ، أو عبارة لغة البرمجة ، أو أمر بروتوكول الحاسوب الذي لا يفعل شيئًا.

تعليمات لغة الآلة

تتضمن بعض مجموعات تعليمات الحاسوب تعليمةً هدفها عدم تغيير حالة أي من السجلات أو علامات الحالة أو الذاكرة التي يمكن للمبرمج الوصول إليها . وغالبًا ما يستغرق تنفيذها عددًا محددًا من دورات الساعة . في بعض مجموعات التعليمات، لا توجد تعليمة NOP صريحة؛ إذ يُمثل اختصار NOP في لغة التجميع تعليمةً عاديةً ذات معلمات تجعلها لا تفعل شيئًا، كما هو الحال في معالجات SPARCsethi 0, %g0 .

يجب ألا يصل أمر NOP إلى الذاكرة، لأن ذلك قد يتسبب في حدوث خطأ في الذاكرة أو خطأ في الصفحة .

تُستخدم تعليمات NOP عادةً لأغراض التوقيت، ولفرض محاذاة الذاكرة ، ولمنع حدوث أخطاء ، ولشغل خانة تأخير التفرع ، ولإلغاء تعليمات موجودة مثل القفز، أو كهدف لتعليمات التنفيذ ، أو كعنصر نائب ليتم استبداله بتعليمات نشطة لاحقًا أثناء تطوير البرنامج (أو لاستبدال التعليمات المحذوفة عندما تكون إعادة التنظيم إشكالية أو تستغرق وقتًا طويلاً). في بعض الحالات، قد يكون لتعليمات NOP آثار جانبية طفيفة؛ على سبيل المثال، في معالجات سلسلة Motorola 68000 ، يتسبب رمز NOP في مزامنة خط الأنابيب . [ 1 ]

فيما يلي تعليمات NOP لبعض بنى المعالجات المركزية:

من وجهة نظر تصميم الأجهزة، غالبًا ما يتم تصميم المناطق غير المعينة من ناقل البيانات لإرجاع أصفار؛ نظرًا لأن سلوك الانزلاق NOP مرغوب فيه في كثير من الأحيان، فإنه يعطي تحيزًا لبرمجته باستخدام رمز العملية الذي يحتوي على جميع الأصفار.

شفرة

تُعتبر الدالة أو سلسلة عبارات لغة البرمجة عبارة NOP أو عبارة فارغة (null) إذا لم يكن لها أي تأثير. وقد تتطلب بعض لغات البرمجة عبارات فارغة في سياقات معينة.

آدا

في لغة آدا ، nullتُستخدم هذه العبارة كأمر لا يُنفذ. [ 35 ] ولأنّ قواعد اللغة تمنع أن تكون عبارات التحكم أو الدوال فارغة، nullيجب استخدام هذه العبارة لتحديد عدم الحاجة إلى أي إجراء. (وبالتالي، إذا نسي المبرمج كتابة سلسلة من العبارات، فسيفشل البرنامج في الترجمة).

ج ومشتقاته

أبسط عبارة NOP في لغة C هي عبارة null ، وهي مجرد فاصلة منقوطة في سياق يتطلب عبارة.

معظم مترجمات لغة C لا تولد أي رمز للعبارات الفارغة، وذلك لأسباب تاريخية وأخرى تتعلق بالأداء.

 ؛

الكتلة الفارغة (العبارة المركبة) هي أيضًا NOP، وقد تكون أكثر قابلية للقراءة، ولكن لن يتم إنشاء أي كود لها بواسطة المترجم.

 {}

في بعض الحالات، مثل جسم الدالة، يجب استخدام كتلة برمجية، ولكن يمكن أن تكون هذه الكتلة فارغة. في لغة C، لا يمكن أن تكون العبارات فارغة؛ إذ يجب أن تنتهي العبارات البسيطة بفاصلة ;منقوطة، بينما تُحاط العبارات المركبة {}بأقواس معقوفة، والتي لا تحتاج بدورها إلى فاصلة منقوطة. لذا، في السياقات التي تتطلب فيها قواعد اللغة وجود عبارة، يمكن استخدام عبارة فارغة.

العبارة الفارغة عديمة الفائدة بحد ذاتها، ولكن يمكن أن يكون لها استخدام نحوي في سياق أوسع، على سبيل المثال، ضمن سياق حلقة تكرارية:

بينما ( getchar () != '\n' ) {}

بدلاً عن ذلك،

بينما ( getchar () != '\n' ) ;

أو باختصار أكثر:

بينما ( getchar () != '\n' );

قد يؤدي الشكل الأخير إلى ظهور تحذير مع بعض المترجمات أو خيارات المترجم، حيث أن الفاصلة المنقوطة الموضوعة بعد قوس في نهاية السطر تشير عادة إلى نهاية تعبير استدعاء الدالة.

يستمر الكود أعلاه في استدعاء الدالة getchar()حتى تُرجع \nحرف سطر جديد، مما يؤدي أساسًا إلى تسريع موقع القراءة الحالي للإدخال القياسي إلى بداية السطر التالي.

إلى جانب عبارة NOP، تستخدم برامج لغة C أحيانًا تعبير NOP ؛ على سبيل المثال، يشترط معيار C أنه في حال NDEBUGتعريف الماكرو قبل ملف الرأس، يُعرَّف الماكرو المُعرَّف بواسطته كتعبير NOP . ويمكن استخدام تقنيات مماثلة في كود المستخدم؛ على سبيل المثال، انظر إلى الكود التالي الذي يُعرِّف ماكرو على دالة prefetch المضمنة التي يوفرها GCC، والتي تُعرَّف كتعبير NOP إذا لم تكن متاحة:<assert.h>assert()((void)0)

#ifdef __GNUC__ #define prefetch(addr, ...) __builtin_prefetch((addr) __VA_OPT__ (,) __VA_ARGS__) #else #define prefetch(addr, ...) ((void)0) #endif

فورتران

في لغة فورتران ، CONTINUEيتم استخدام العبارة في بعض السياقات مثل العبارة الأخيرة في حلقة DO، على الرغم من أنه يمكن استخدامها في أي مكان، وليس لها أي وظائف.

جافا سكريبت

لا تحتوي لغة جافا سكريبت على عبارة NOP مدمجة. توجد العديد من التطبيقات الممكنة:

  • استخدم ;العبارة الفارغة [ 36 ] أو عبارة الكتلة{} الفارغة بنفس الطريقة كما في أمثلة C والمشتقات ؛
  • استخدم التعبير undefinedأو العبارة nullكعبارة كاملة ( عبارة تعبيرية ) عندما لا تسمح الصيغة بالطرق السابقة.

البدائل، في الحالات التي تتطلب وظيفة معينة، هي:

  • استخدم الدالة Function.prototype()المدمجة التي تقبل أي وسيطات وتعيد قيمة undefined؛ [ 37 ]
  • استخدم دالة NOP المتوفرة في مكتبة خارجية —انظر أدناه؛
  • قم بتعريف دالة NOP مخصصة، كما في المثال التالي (باستخدام صيغة دالة السهم ES6 ):
const noop = () => {};

AngularJS

يوفر إطار عمل AngularJS وظيفة angular.noop التي لا تقوم بأي عمليات.

jQuery

توفر مكتبة jQuery دالة لا تفعلjQuery.noop() شيئًا. [ 38 ]

لوداش

توفر مكتبة Lodash دالةً _.noop()تُرجع قيمة غير مُعرَّفة ولا تفعل شيئًا. [ 39 ]

باسكال

كما هو الحال في لغة C،  يمكن استخدام الفاصلة المنقوطة (;) وحدها كعبارة فارغة في لغة باسكال . في الواقع، وبسبب مواصفات اللغة، فإن الفاصلة المنقوطة اختيارية قبل عبارة END في كتلة BEGIN/END، وبالتالي فإن استخدامها هناك غير ضروري.

BEGIN END;كما يمكن استخدام كتلة تتكون من كعنصر نائب للإشارة إلى عدم وجود إجراء، حتى لو تم وضعها داخل كتلة BEGIN / END أخرى.

بايثون

تحتوي لغة البرمجة بايثون على passعبارة لا تُحدث أي تأثير عند تنفيذها، وبالتالي تُعتبر بمثابة NOP. تُستخدم هذه العبارة بشكل أساسي لضمان صحة بناء الجملة نظرًا لحساسية بايثون للمسافات البادئة ؛ فعلى سبيل المثال، يتطلب تعريف فئة ما كتلة مُسافة بادئة تحتوي على منطق الفئة، والتي يجب التعبير عنها بـ `n` passعندما يجب أن تكون فارغة.

كتابة البرامج النصية (bash، zsh، إلخ.)

الأمر ` :` [colon]` هو أمر مدمج في الصدفة له تأثير مشابه لأمر "NOP" (عملية لا تفعل شيئًا). وهو ليس من الناحية التقنية أمر NOP، لأنه يُغيّر المعامل الخاص $? (حالة خروج الأمر الأخير) إلى 0. ويمكن اعتباره مرادفًا للأمر المدمج `true` في الصدفة، وحالة خروجه هي true (0). [ 40 ] [ 41 ] [ 42 ]

لغة ماكرو TeX (ConTeXt، LaTeX، إلخ)

تحتوي لغة الماكرو الخاصة بنظام TeX الطباعي على الأمر .\relax [ 43 ] لا يقوم هذا الأمر بأي شيء بمفرده، ولكن يمكن استخدامه لمنع الأمر السابق له مباشرةً من تحليل أي رموز لاحقة. [ 44 ]

أوامر بروتوكول NOP

تتضمن العديد من بروتوكولات الحاسوب ، مثل Telnet ، أمر NOP الذي يمكن للعميل إصداره لطلب استجابة من الخادم دون طلب أي إجراءات أخرى. يُستخدم هذا الأمر للتأكد من استمرار الاتصال أو استجابة الخادم. يُعد أمر NOOP جزءًا من البروتوكولات التالية ( هذه قائمة جزئية ):

بخلاف البروتوكولات الأخرى المدرجة، فإن أمر IMAP4 NOOP له غرض محدد - فهو يسمح للخادم بإرسال أي إشعارات معلقة إلى العميل.

بينما تستجيب معظم خوادم Telnet أو FTP لأمر NOOP بـ "OK" أو "+OK"، أضاف بعض المبرمجين استجابات غريبة للعميل. على سبيل المثال، يستجيب ftpdبرنامج MINIX الخفي لأمر NOOP بالرسالة: [ 45 ]

200 دولار لك أيضاً!

التصدع

تُستخدم تعليمات NOP غالبًا في اختراق البرامج التي تتحقق من الأرقام التسلسلية، أو متطلبات الأجهزة أو البرامج المحددة، أو وجود أو عدم وجود أجهزة حماية ، وما إلى ذلك، وذلك على شكل شريحة NOP . تتم هذه العملية عن طريق تعديل الدوال والإجراءات الفرعية لتجاوز فحوصات الأمان، واستبدالها ببساطة بإرجاع القيمة المتوقعة التي يتم التحقق منها. ولأن معظم التعليمات في روتين فحص الأمان ستكون غير مستخدمة، فسيتم استبدالها بتعليمات NOP، مما يؤدي إلى إزالة وظيفة الأمان للبرنامج دون تغيير ترتيب كل ما يليها في الملف التنفيذي.

ثغرات أمنية

يمكن استخدام رمز NOP لتشكيل انزلاق NOP ، مما يسمح بتنفيذ التعليمات البرمجية عندما تكون القيمة الدقيقة لمؤشر التعليمات غير محددة (على سبيل المثال، عندما يتسبب تجاوز المخزن المؤقت في الكتابة فوق عنوان إرجاع الدالة على المكدس).

انظر أيضاً

مراجع

  1. 1 2 3 4 5 دليل مرجعي لمبرمج موتورولا 68000 (PDF) .
  2. 1 2 3 4 "دليل مطوري برامج معمارية Intel 64 و IA-32: مرجع مجموعة التعليمات AZ" . تم الاطلاع عليه بتاريخ 1 مارس 2012 .
  3. 1 2 دليل مرجعي لمبرمج المعالج الدقيق i860 ذو 64 بت (ملف PDF) . إنتل. فبراير 1989. الصفحات 68، 172. رقم الطلب 240329-002. 
  4. دليل مطوري المعالج الدقيق i960 Hx (ملف PDF) . إنتل. سبتمبر 1998. انظر الملحق ب في الصفحة 487 والملحق ج في الصفحات 495-497 لترميز التعليمات، والملحق هـ.2.7.8 في الصفحة 575 لاستخدام MOV g0,g0 كعملية حشو لا تفعل شيئًا. رقم الطلب 272484-002. مؤرشف من الأصل (ملف PDF) في 15 أبريل 2003.
  5. دليل مطوري برامج معمارية إنتل إيتانيوم، الإصدار 2.3 (ملف PDF) . إنتل. مايو 2010. الكتاب 3، القسم 2.2 في الصفحة 1092، القسم 4.3.4.1 في الصفحة 1218، القسم 4.4.11 في الصفحة 1248، القسم 4.5.3.2 في الصفحة 1255، القسم 4.6.9.2 في الصفحة 1264، والقسم 4.7.4 في الصفحة 1267. مؤرشف (ملف PDF) من النسخة الأصلية بتاريخ 8 ديسمبر 2011.
  6. 1 2 دليل مرجعي لهندسة ARM، إصدار ARMv7-A وARMv7-R . ARM. 29 مارس 2018. القسم A8.8.120 في الصفحة 511. ARM DDI 0406C.d. مؤرشف من الأصل في 27 سبتمبر 2023.
  7. دليل مرجعي لمجموعة أدوات تطوير برمجيات ARM، الإصدار 2.50 . ARM. نوفمبر 1998. انظر القسمين 5.5.6 و5.6.4 للاطلاع على تعليمات NOP بلغة التجميع ARM/Thumb. ARM DUI 0041C. مؤرشف من الأصل في 1 يونيو 2022.
  8. 1 2 "تعليمات NOP" . مرجع مُجمِّع سلسلة أدوات مُصرِّف ARM الإصدار 5.03 . ARM.{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  9. 1 2 أو. سميث (12 ديسمبر 1996). "معالج StrongARM يضاعف السرعة" . مجموعة الأخبار : comp.sys.arm . مؤرشف من الأصل في 16 مارس 2025. 
  10. إصدار Acorn Assembler 2 (ملف PDF) . شركة Acorn Computers. مايو 1991. تم إدراج MOVNV في الصفحة 218. مؤرشف (ملف PDF) من النسخة الأصلية بتاريخ 25 أكتوبر 2018.
  11. معالج ARM610 32 بت RISC (ملف PDF) . ARM. أغسطس 1993. ص 20. ARM DDI 0004D. 
  12. دليل مرجعي لهندسة ARM (ملف PDF) . ARM. فبراير 2000. القسم 3.2.1 في الصفحة 69. ARM DDI 0100D. مؤرشف (ملف PDF) من الأصل في 16 مارس 2025.
  13. 1 2 3 دليل معمارية ألفا، الإصدار 4 (ملف PDF) . كومباك. أكتوبر 1998. انظر القسم أ.4.4.1 في الصفحة 285 للاطلاع على نماذج NOP، والقسمين 3.3 في الصفحة 50 و ج.1 في الصفحة 303 للاطلاع على ترميزات التعليمات. رقم الطلب: EC–QD2KC–TE. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 27 أغسطس 2004.
  14. جيه إتش إدموندسون (أبريل 1995). "تنفيذ التعليمات فائقة القياس في المعالج الدقيق ألفا 21164" (ملف PDF) . ص 6. مؤرشف (ملف PDF) من الأصل في 5 يناير 2023. 
  15. دليل مبرمج لغة التجميع لنظام يونكس الرقمي (ملف PDF) . ديجيتال. مارس 1996. انظر القسم C.7 في الصفحة 219. رقم الطلب AA-PS31D-TE. مؤرشف من النسخة الأصلية (ملف PDF) في 1 أكتوبر 2000.
  16. AMD، "دليل مستخدم المعالج الدقيق Am29050" (PDF) . 1991. الصفحات 223، 257. 
  17. "2. تعليمات عملية المكدس §2-77 NOP لا عملية." دليل مرجعي لمجموعة تعليمات الآلة (PDF) . أنظمة حاسوب HP 3000. هيوليت-باكارد. يونيو 1984. الصفحات 2-23 (الصفحة 50 من ملف PDF). 30000-90022 عبر BitSavers. 
  18. Hyperstone Electronics GmbH، دليل مستخدم المعالج الدقيق Hyperstone E1-32/E1-16 32 بت ، الإصدار 03/96، الصفحات 35، 38، 70.
  19. "الخصائص الوظيفية لنظام IBM System/360 موديل 91" (ملف PDF) . مكتبة مراجع الأنظمة. IBM. صفحة 16. تاريخ الاسترجاع: 17 يناير 2025 . 
  20. دليل مرجعي لـ LoongArch، المجلد 1: البنية الأساسية، الإصدار 1.10 (ملف PDF) . لونغسون. القسم 2.2.1.10 في الصفحة 23 والملحق ب في الصفحة 190.
  21. دليل مرجعي لمعالج MicroBlaze من AMD/Xilinx، UG984 (الإصدار 2021.2)، 27 أكتوبر 2021، صفحة 281
  22. مواصفات تصميم المعالج الدقيق MC88110 ذو 32 بت، الإصدار 2.0 (ملف PDF) . موتورولا. انظر القسم 2.1.2.3 في الصفحة 11 للاطلاع على قائمة بتعليمات NOP الموصى بها، والصفحات 10 و170 و171 للاطلاع على ترميزات التعليمات. مؤرشف (ملف PDF) من النسخة الأصلية بتاريخ 19 مارس 2025.
  23. دليل مستخدم عائلة MSP430F2xx وMSP430G2xx (ملف PDF) . شركة تكساس إنسترومنتس. ديسمبر 2004. الأقسام 3.24 في الصفحة 47، و3.4.5 في الصفحة 63، و3.4.6.33 في الصفحة 98. مؤرشف (ملف PDF) من النسخة الأصلية في 1 سبتمبر 2022.
  24. 1 2 بنية PA-RISC 2.0 (ملف PDF) . هيوليت-باكارد . 1995. الصفحات 2-21 ، 7-103 . مؤرشف من الأصل (ملف PDF) في 21 يونيو 2020. 
  25. Power ISA الإصدار 3.1C (ملف PDF) . مؤسسة OpenPOWER. 26 مايو 2024. الكتاب 1، القسم 3.3.13، الصفحات 97-99؛ الكتاب 2، القسم 3.2، الصفحة 987، والقسم 4.3.3، الصفحة 1005؛ الكتاب 3، القسم 5.4.3، الصفحة 1100، والقسم 9.2.1، الصفحة 1244، والقسم 11.3، الصفحة 1253. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 10 سبتمبر 2024.
  26. دليل برمجة محرك النطاق العريض الخلوي، الإصدار 1.1 (ملف PDF) . شركة IBM. 24 أبريل 2007. القسم 10.6.2.2 في الصفحة 316. مؤرشف (ملف PDF) من النسخة الأصلية في 24 مايو 2008.
  27. "موجز SCINET: التجميع لـ Power6" (ملف PDF) . IBM. فبراير 2009. الشريحة 9. مؤرشف (ملف PDF) من الأصل في 23 مارس 2025.
  28. دليل مستخدم معالج POWER8 للوحدة أحادية الشريحة، الإصدار 1.3 (ملف PDF) . شركة IBM . 16 مارس 2016. القسم 10.1.8 في الصفحة 209. مؤرشف (ملف PDF) من النسخة الأصلية بتاريخ 28 ديسمبر 2018.
  29. دليل مجموعة تعليمات RISC-V، المجلد 1: مجموعة تعليمات مستوى المستخدم، الإصدار 2.2 (ملف PDF) . مؤسسة RISC-V . 7 مايو 2017. ص 79. 
  30. ويفر، د. ل.؛ جيرموند، ت.، محرران. (1994). دليل بنية SPARC، الإصدار 9 (PDF) . برنتيس هول . ISBN 0-13-825001-4أُرشف من النسخة الأصلية (PDF) بتاريخ 18 يناير 2012. تم الاطلاع عليه بتاريخ 9 يناير 2014. لاحظ أن NOP حالة خاصة من تعليمة SETHI، حيث imm22 = 0 و rd = 0.
  31. "دليل برمجة S+core7 الإصدار 1.4" (ملف PDF) . شركة Sunplus Technology المحدودة. 22 مارس 2007. الصفحات 12، 90، 166. مؤرشف من النسخة الأصلية (ملف PDF) في 15 نوفمبر 2012. 
  32. معالج SH-5، المجلد 3: SHcompact (ملف PDF) . شركة SuperH، 22 فبراير 2002، صفحة 219. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 20 مارس 2009. 
  33. معالج SH-5، المجلد 2: SHmedia (ملف PDF) . شركة SuperH، 22 فبراير 2000، صفحة 260. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 20 مارس 2009. 
  34. دليل مرجعي لبنية مجموعة تعليمات Xtensa (ملف PDF) . تينسيليكا. أبريل 2010. الصفحات 459-460 . مؤرشف (ملف PDF) من الأصل في 5 مارس 2016. 
  35. دليل مرجعي للغة آدا . الدلالات الديناميكية. لا يؤثر تنفيذ عبارة فارغة.
  36. "عبارة فارغة" . مرجع جافا سكريبت لشبكة مطوري موزيلا . 13 مارس 2025. العبارة الفارغة هي فاصلة منقوطة ( ) تشير إلى أنه لن يتم تنفيذ أي عبارة، حتى لو كان بناء جملة جافا سكريبت يتطلب واحدة.;
  37. "خصائص كائن النموذج الأولي للدالة" . مواصفات لغة ECMAScript - الإصدار 5.1 .
  38. jQuery.noop() من وثائق واجهة برمجة تطبيقات jQuery
  39. "وثائق لوداش" . lodash.com . تم الاطلاع عليه بتاريخ 15-12-2017 .
  40. "الفصل 3. الأحرف الخاصة" . دليل متقدم لكتابة البرامج النصية بلغة باش .
  41. صفحة دليل باش > أوامر شل المدمجة
  42. صفحة دليل zsh (أوامر zsh المدمجة) > أوامر شل المدمجة
  43. باوسوم، ديفيد (2002). "تسلسلات التحكم الأولية في TeX". دليل TeX المرجعي . دار نشر كلوير الأكاديمية . تم الاطلاع عليه في 1 أبريل 2020. وفقًا لكتاب TeXbook، "لا يفعل TeX شيئًا" عند مصادفته . في الواقع، قد يُخبر TeX، "هذه نهاية ما كنت تفعله".\relax\relax
  44. كتاب ويكي TeX – استرخِ
  45. "ftpd.c" . تم الاطلاع عليه بتاريخ 19-06-2016 .