আমাদের কেন "নাপ" দরকার? অর্থাৎ মাইক্রোপ্রসেসর 8085 এ কোনও অপারেশন নির্দেশ নেই?


19

মাইক্রোপ্রসেসর 8085 নির্দেশে, একটি মেশিন নিয়ন্ত্রণ অপারেশন "নাপ" (কোনও অপারেশন নেই) রয়েছে। আমার প্রশ্ন হল আমাদের কেন অপারেশন দরকার? মানে আমরা যদি প্রোগ্রামটি শেষ করতে হয় তবে আমরা এইচএলটি বা আরএসটি 3 ব্যবহার করব বা আমরা যদি পরবর্তী নির্দেশে যেতে চাই তবে আমরা পরবর্তী নির্দেশাবলী দেব। তবে কেন অপারেশন হচ্ছে না? দরকার কী?


5
আপনার প্রোগ্রামটি ডিবাগিং এবং আপডেট করতে NOP প্রায়শই ব্যবহৃত হয়। যদি পরবর্তী কোনও তারিখে, আপনি আপনার প্রোগ্রামে কিছু লাইন যুক্ত করতে চান, আপনি কেবল NOP ওভাররাইট করতে পারেন। অন্যথায় আপনাকে লাইনগুলি সন্নিবেশ করতে হবে, এবং সন্নিবেশ করানো মানে পুরো প্রোগ্রামটি স্থানান্তর করা। এছাড়াও ত্রুটিযুক্ত নির্দেশাবলী (ভুল) একই আর্গুমেন্ট অনুসরণ করে NOP দ্বারা প্রতিস্থাপন করা যাবে (কেবল ওভাররাইট করা)।
প্লুটোনিয়াম চোরাচালানকারী

Ohkay। তবে নোপ ব্যবহার করে স্থানও বাড়ছে। যদিও আমাদের প্রাথমিক লক্ষ্য এটি খুব সামান্য জায়গা করে নেওয়া make
Demietra95

* আমি বোঝাতে চাইছি আমাদের লক্ষ্য একটি সমস্যা আরও ছোট করা। সুতরাং এটিও সমস্যা হয়ে ওঠে না?
Demietra95

2
কেন এটি বুদ্ধিমানের সাথে ব্যবহার করা উচিত ts অন্যথায় আপনার পুরো প্রোগ্রামটি কেবল এনওপিগুলির একগুচ্ছ হবে।
প্লুটোনিয়াম চোরাচালানকারী

উত্তর:


34

সিপিইউ এবং এমসিইউগুলিতে এনওপি (বা এনওওপি, নো-অপারেশন) নির্দেশের একটি ব্যবহার আপনার কোডটিতে সামান্য, অনুমানযোগ্য, বিলম্ব সন্নিবেশ করানো। যদিও এনওপিগুলি কোনও অপারেশন করে না, সেগুলি প্রক্রিয়া করতে কিছুটা সময় লাগে (সিপিইউকে অপকোড আনতে এবং ডিকোড করতে হয়, তাই এটি করতে কিছুটা সময় প্রয়োজন)। কোনও এনওপি নির্দেশনা কার্যকর করার জন্য 1 টি সিপিইউ চক্রটি "নষ্ট" হয় (সঠিক নম্বরটি সাধারণত সিপিইউ / এমসিইউ ডেটাশিট থেকে অনুমান করা যায়), সুতরাং এনওপিগুলি যথাক্রমে স্থাপন করা অনুমানযোগ্য বিলম্ব সন্নিবেশ করার একটি সহজ উপায়:

টিএকটিY=এনটিকে

যেখানে কে হ'ল এনওপি নির্দেশের প্রসেসিংয়ের জন্য প্রয়োজনীয় চক্রের সংখ্যা (প্রায়শই 1) এবং ঘড়ির সময়সীমা।টি

তুমি ওটা কেন করবে? সিপিইউকে বাহ্যিক (সম্ভবত ধীরে ধীরে) ডিভাইসগুলির জন্য তাদের কাজ শেষ করতে এবং সিপিইউতে ডেটা রিপোর্ট করার জন্য কিছুটা অপেক্ষা করতে বাধ্য করা কার্যকর হতে পারে, যেমন সিএনপি সিঙ্ক্রোনাইজেশন উদ্দেশ্যে কার্যকর।

এনওপি-তে সম্পর্কিত উইকিপিডিয়া পৃষ্ঠাটিও দেখুন ।

আরেকটি ব্যবহার হ'ল মেমোরি এবং অন্যান্য "অ্যাসেম্বলি ট্রিকস" এর নির্দিষ্ট ঠিকানায় কোড প্রান্তিককরণ, যেমন প্রোগ্রামারস.এস.ই. এবং এই স্ট্রেড ওভারফ্লোতে এই থ্রেডে ব্যাখ্যা করা হয়েছে ।

বিষয়টির আরও একটি আকর্ষণীয় নিবন্ধ

এই একটি Google বই পৃষ্ঠার লিঙ্ক বিশেষত 8085 সিপিইউ বোঝায়। উদ্ধৃতাংশ:

প্রতিটি এনওপি নির্দেশনা আনা, ডিকোডিং এবং কার্যকর করার জন্য চারটি ঘড়ি ব্যবহার করে।

সম্পাদনা (একটি মন্তব্যে প্রকাশিত উদ্বেগের সমাধানের জন্য)

আপনি যদি গতি সম্পর্কে উদ্বিগ্ন হন তবে মনে রাখবেন যে (সময়) দক্ষতা বিবেচনা করার জন্য কেবল একটি পরামিতি। এটা সব আবেদন উপর নির্ভর: আপনি 10-কোটি চিত্রে গনা করতে চান , তাহলে আপনার একমাত্র উদ্বেগের গতি হতে পারে। অন্যদিকে, আপনি যদি কোনও এডিসির মাধ্যমে এমসিইউতে সংযুক্ত তাপমাত্রা সেন্সরগুলি থেকে ডেটা লগ করতে চান, তবে গতি সাধারণত এতটা গুরুত্বপূর্ণ নয়, তবে প্রতিটি পাঠকে এডিসিকে সঠিকভাবে সম্পন্ন করার জন্য সঠিক সময়ের জন্য অপেক্ষা করা প্রয়োজনীয় । এই ক্ষেত্রে যদি এমসিইউ পর্যাপ্ত অপেক্ষা না করে তবে এটি সম্পূর্ণ অবিশ্বাস্য ডেটা পাওয়ার ঝুঁকিপূর্ণ (আমি স্বীকার করি এটি দ্রুত ডেটা পেতে পারে , যদিও: ও)।π


3
অনেকগুলি জিনিস (বিশেষত ইউসি-র বাইরের বাইরের ড্রাইভিং আইসি) সময়সীমার সীমাবদ্ধতার মতো 'ডি এর মধ্যে ন্যূনতম সময় স্থিতিশীল হওয়া এবং ঘড়ির প্রান্তটি 100 আমাদের হয়', বা 'আইআর এলইডি অবশ্যই 1 মেগাহার্টজ এ জ্বলজ্বল করে' like অতএব (সঠিক) বিলম্ব প্রায়শই প্রয়োজন হয়।
ওয়াউটার ভ্যান ওইজেন

6
সিরিয়াল প্রোটোকলটিতে বিট-ব্যাং করার সময় এনওপিগুলি ঠিক সময় পাওয়ার জন্য কার্যকর হতে পারে। প্রোগ্রামের কাউন্টারটি দুর্নীতিগ্রস্থ হয়ে উঠলে (যেমন পিএসইউ গ্লাচ, বিরল গামা রশ্মির ইভেন্ট ইত্যাদি দ্বারা প্রভাবিত হয়) এবং কোনওটিতে কোড কার্যকর করতে শুরু করে তবে বিরল পরিস্থিতিতে কোল্ড-স্টার্ট ভেক্টরে ঝাঁপিয়ে পড়ে অব্যবহৃত কোড স্থান পূরণেও তারা কার্যকর হতে পারে an অন্যথায় কোড স্পেসের খালি অংশ।
টেকাইডুড

6
আটারি 2600 ভিডিও কম্পিউটার সিস্টেমে (কার্টিজগুলিতে সঞ্চিত প্রোগ্রামগুলি চালানোর জন্য দ্বিতীয় ভিডিও গেম কনসোল), প্রসেসর প্রতিটি স্ক্যান লাইনে ঠিক 76 টি চক্র চালাত, এবং অনেকগুলি ক্রিয়াকলাপটি শুরু হওয়ার পরে কিছু সঠিক সংখ্যার চক্র সম্পাদন করা প্রয়োজন স্ক্যান লাইন। সেই প্রসেসরে ডকুমেন্টেড "এনওপি" নির্দেশিকা দুটি চক্র গ্রহণ করে, তবে কোডটি অন্যথায়-অব্যর্থহিত তিন-চক্র নির্দেশকে একটি নির্দিষ্ট সংখ্যক চক্রের জন্য বিলম্ব করার জন্য ব্যবহার করাও সাধারণ। দ্রুত রানিং কোডটি পুরোপুরি গার্ডড ডিসপ্লে উপস্থাপন করতে পারে।
সুপারক্যাট

1
বিলম্বের জন্য এনওপিগুলি ব্যবহার করা এমনকি রিয়েল-টাইম সিস্টেমগুলিতে এমনকি আই / ও ডিভাইস ক্রমাগত ক্রিয়াকলাপের মধ্যে ন্যূনতম সময় আরোপ করে, তবে সর্বাধিক নয় sense উদাহরণস্বরূপ, অনেক কন্ট্রোলারে, একটি এসপিআই বন্দরটি বাইট স্থানান্তরিত করতে আটটি সিপিইউ চক্র লাগবে। কোড যা মেমরি থেকে বাইট আনার পাশাপাশি এসপিআই বন্দরে সেগুলি আউটপুট থেকে সামান্য দ্রুত চলতে পারে, কিন্তু এসপিআই বন্দরটি প্রতিটি বাইটের জন্য প্রস্তুত কিনা তা পরীক্ষা করার জন্য যুক্তি যুক্ত করে অকারণে ধীর করে দেবে। একটি এনওপি বা দুটি যুক্ত করা সর্বাধিক উপলভ্য গতি অর্জনের জন্য
কোডকে

1
... যেখানে কোনও বাধা নেই in যদি কোনও বাধা দেয়, এনওপিগুলি অযথা সময় নষ্ট করে তবে একটি বা দু'টি এনওপি সময় নষ্ট করে তা সময় নির্ধারণের জন্য প্রয়োজনীয় সময়ের চেয়ে কম হবে যদি কোনও বাধা তাদের অকারণে করে তোলে কিনা।
সুপারক্যাট

8

অন্যান্য উত্তরগুলি কেবলমাত্র এমন একটি এনওপি বিবেচনা করছে যা আসলে কোনও সময়ে কার্যকর হয় - যা বেশ সাধারণভাবে ব্যবহৃত হয়, তবে এটি কেবল এনওপি-র ব্যবহার নয়।

অ নির্বাহ NOP যখন কোডটি patched করা যেতে পারে লেখার বেশ উপকারী - মূলত, আপনি যা করবেন প্যাড কয়েক NOPs সঙ্গে ফাংশন পরRET (বা অনুরূপ নির্দেশ)। যখন আপনাকে এক্সিকিউটেবল প্যাচ করতে হয়, আপনি সহজেই মূল থেকে শুরু করে ফাংশনে আরও কোড যুক্ত করতে পারেন RETএবং আপনার প্রয়োজনীয় যতগুলি এনওপি ব্যবহার করা হয় (যেমন দীর্ঘ জাম্প বা এমনকি ইনলাইন কোডের জন্য) এবং অন্যটির সাথে শেষ করে RET

এই ব্যবহারের ক্ষেত্রে, কোনওরও কখনই NOPমৃত্যুদন্ড কার্যকর করার প্রত্যাশা করে না। এক্সিকিউটেবল প্যাচিংয়ের একমাত্র পয়েন্টটি হ'ল - তাত্ত্বিক নন-প্যাডেড এক্সিকিউটেবলের মধ্যে, আপনাকে আসলে ফাংশনের কোডটি নিজেই পরিবর্তন করতে হবে (কখনও কখনও এটি মূল সীমানা মাপসই করতে পারে তবে বেশিরভাগ ক্ষেত্রেই আপনাকে যাইহোকের প্রয়োজন হবে) ) - এটি অনেক জটিল, বিশেষত ম্যানুয়ালি লিখিত সমাবেশ বা একটি অনুকূলিতকরণ সংকলক বিবেচনা করে; আপনাকে জাম্প এবং অনুরূপ নির্মানকে সম্মান করতে হবে যা কিছু গুরুত্বপূর্ণ কোডের দিকে নির্দেশ করতে পারে। সব মিলিয়ে বেশ কৌতূহলপূর্ণ।

অবশ্যই, এই আরো অনেক প্রচন্ডভাবে, সেকালের দিন ব্যবহার যখন এটি এই মত প্যাচ করতে দরকারী ছিল ছোট এবং অনলাইন । আজ, আপনি কেবল একটি পুনরায় সংশ্লেষিত বাইনারি বিতরণ করবেন এবং এটি সম্পন্ন করুন। এখনও কিছু রয়েছে যারা প্যাচিং এনওপি ব্যবহার করে (কার্যকর করা হয় বা না, এবং সবসময় আক্ষরিক নয় NOP- উদাহরণস্বরূপ, উইন্ডোজ MOV EDI, EDIঅনলাইনে প্যাচিংয়ের জন্য ব্যবহার করে - এটি সেই ধরণের যেখানে আপনি সিস্টেম লাইব্রেরি আপডেট করতে পারবেন যখন সিস্টেমটি চলমান চলাকালীন, পুনরায় আরম্ভের প্রয়োজন ছাড়াই)।

সুতরাং সর্বশেষ প্রশ্নটি হল, কেন এমন কিছু যা সত্যিই কিছু করে না তার জন্য একটি উত্সর্গীকৃত নির্দেশনা রয়েছে?

  • এটি একটি আসল নির্দেশ - ডিবাগিং বা হ্যান্ডকোডিং অ্যাসেম্বলির সময় গুরুত্বপূর্ণ। মত নির্দেশাবলী MOV AX, AXহুবহু একই কাজ করবে, তবে উদ্দেশ্যটি এতটা স্পষ্টভাবে সংকেত দেয় না।
  • প্যাডিং - "কোড" যা কেবলমাত্র সারিবদ্ধকরণের উপর নির্ভর করে কোডের সামগ্রিক কর্মক্ষমতা উন্নত করতে পারে। এটি কখনই মৃত্যুদন্ড কার্যকর করা উচিত নয়। কিছু ডিবাগারগুলি সহজেই তাদের বিচ্ছিন্নতায় প্যাডিং এনওপিগুলি লুকিয়ে রাখেন।
  • এটি সংকলকগুলির অনুকূলকরণের জন্য আরও স্থান দেয় - এখনও ব্যবহৃত প্যাটার্নটি হ'ল আপনি সংকলনের দুটি ধাপ পেয়েছেন, প্রথমটি বরং সরল এবং প্রচুর অপ্রয়োজনীয় সমাবেশ কোড উত্পাদন করছে, যখন দ্বিতীয়টি মুছে ফেলা হয়, ঠিকানা উল্লেখগুলি পুনর্বিবেচনা করে এবং অপসারণ করে বহিরাগত নির্দেশাবলী। এটি প্রায়শই জেআইটি-সংকলিত ভাষায়ও দেখা যায় -। নেট এর আইএল এবং জেভিএম-এর বাইট-কোড ব্যবহার NOPঅনেকটা; প্রকৃত সংকলিত অ্যাসেম্বলি কোডের আর এগুলি নেই। এটি লক্ষ করা উচিত যে সেগুলি NOPযদিও x86- গুলি নয় ।
  • এটি অনলাইন ডিবাগিংকে উভয়ই পড়ার জন্য সহজ করে তোলে (প্রাক- NOPশূন্যপদ মেমরিটি সর্বজনীন হয়ে উঠবে, বিচ্ছিন্নভাবে পড়া সহজ করে তোলে) এবং হট-প্যাচিংয়ের জন্য (যদিও আমি ভিজ্যুয়াল স্টুডিওতে সম্পাদনা এবং চালিয়ে যাওয়া পছন্দ করি: পি)।

এনওপিগুলি কার্যকর করার জন্য অবশ্যই আরও কয়েকটি পয়েন্ট রয়েছে:

  • পারফরম্যান্স, অবশ্যই - এটি কেন এটি 8085-এ ছিল না, তবে এমনকি 80486 এর মধ্যে ইতিমধ্যে পাইপলাইনযুক্ত নির্দেশনা কার্যকর করা হয়েছিল, যা "কিছুই না করা" কিছুটা কৌতুকপূর্ণ করে তোলে।
  • যেমন দেখা গেছে MOV EDI, EDI, আক্ষরিকের চেয়ে আরও কার্যকর এনওপি রয়েছে NOPMOV EDI, EDIx86 এ 2-বাইট এনওপি হিসাবে সেরা অভিনয় রয়েছে। আপনি যদি দুটি ব্যবহার করেন NOP, তবে এটি কার্যকর করার জন্য দুটি নির্দেশিকা হবে।

সম্পাদনা করুন:

আসলে, @ দিমিত্রিগ্রিরিভের সাথে আলোচনার ফলে আমাকে এটি সম্পর্কে আরও কিছুটা ভাবতে বাধ্য করেছে, এবং আমি মনে করি এটি এই প্রশ্ন / উত্তরের একটি মূল্যবান সংযোজন, তাই আমাকে আরও কিছু বিট যোগ করতে দিন:

প্রথমত, বিন্দুটি, স্পষ্টতই - কেন এমন কোনও নির্দেশনা থাকবে যা এমন কিছু করে mov ax, ax? উদাহরণস্বরূপ, আসুন 8086 মেশিন কোড (এমনকি 386 মেশিন কোডের চেয়ে পুরানো) এর ক্ষেত্রে দেখুন:

  • অপকোড সহ একটি নিবেদিত এনওপি নির্দেশনা রয়েছে 0x90। এটি এখনও সেই সময় যখন বহু লোক সমাবেশে লিখেছিল, মনে রাখবেন। সুতরাং যদি কোনও উত্সর্গীকৃত NOPনির্দেশ না পাওয়া যায় তবে NOPকীওয়ার্ডটি (ওরফে / মিমোনমিক) এখনও কার্যকর হবে এবং এটিতে মানচিত্র তৈরি হবে।
  • MOVপ্রকৃতপক্ষে অনেকগুলি বিভিন্ন অপকোডে মানচিত্রের মতো নির্দেশনা , কারণ এটি সময় এবং স্থানের সঞ্চয় করে - উদাহরণস্বরূপ, mov al, 42" alরেজিস্টারে তাত্ক্ষণিক বাইট সরান ", যা অনুবাদ করে 0xB02A( 0xB0অপকড 0x2Aহওয়ায়, "তাত্ক্ষণিক" যুক্তি হয়ে)। সুতরাং যে দুটি বাইট লাগে।
  • এর জন্য কোনও শর্টকাট অপকোড নেই mov al, al(যেহেতু এটি মূলত করণীয় একটি মূ .় কাজ), সুতরাং আপনাকে mov al, rmb(আরবিএম হ'ল "রেজিস্টার বা স্মৃতি") ওভারলোড ব্যবহার করতে হবে। এটি আসলে তিন বাইট লাগে । (যদিও এটি সম্ভবত এর mov rb, rmbপরিবর্তে কম নির্দিষ্ট ব্যবহার করবে, যার জন্য কেবল দুটি বাইট নেওয়া উচিত mov al, al- আর্গুমেন্ট বাইটটি উত্স এবং লক্ষ্য রেজিস্ট্রার উভয়ই নির্দিষ্ট করতে ব্যবহৃত হয়; এখন আপনি জানেন যে কেন ৮৮86৮ টিতে কেবল ৮ টি রেজিস্টার ছিল: ডি)। তুলনা করুন NOP, যা আ সিঙ্গল বাইট নির্দেশ! এটি মেমরি এবং সময় সাশ্রয় করে, যেহেতু ৮০৮৮ সালে মেমোরিটি পড়া এখনও বেশ ব্যয়বহুল - অবশ্যই কোনও প্রোগ্রামটি কোনও টেপ বা ফ্লপি বা অন্য কিছু থেকে লোড করার কথা বলা উচিত নয়।

তাহলে xchg ax, axকোথা থেকে আসে? আপনাকে কেবল অন্যান্য xhcgনির্দেশাবলীর অপকডগুলি দেখতে হবে । আপনি দেখতে পাবেন 0x86, 0x87এবং শেষ পর্যন্ত 0x91- 0x97। সুতরাং nopএটির জন্য এটি 0x90বেশ ভাল ফিটের মতো বলে মনে হচ্ছে xchg ax, ax(যা আবার কোনও xchg"ওভারলোড" নয় - আপনাকে xchg rb, rmbদুটি বাইটে ব্যবহার করতে হবে )। এবং প্রকৃতপক্ষে, আমি খুব নিশ্চিত যে এটি সেই সময়ের মাইক্রো-আর্কিটেকচারের একটি দুর্দান্ত পার্শ্ব-প্রতিক্রিয়া ছিল - যদি আমি সঠিকভাবে স্মরণ করি তবে 0x90-0x97"এক্সসিজিজি, রেজিস্টারগুলির উপরে অভিনয় axএবং ax- di" এর পুরো পরিসীমাটি ম্যাপ করা সহজ ছিল ( অপারেণ্ডটি প্রতিসাম্যহীন হওয়ায় এটি আপনাকে নাপ সহ পুরো পরিসর দেয় xchg ax, ax; লক্ষ্য করুন যে আদেশটি রয়েছে ax, cx, dx, bx, sp, bp, si, di- bxপরে রয়েছে dx,ax; মনে রাখবেন, নিবন্ধের নামগুলি স্মৃতিবিজ্ঞান, অর্ডার করা নাম নয় - সংগ্রহকারী, কাউন্টার, ডেটা, বেস, স্ট্যাক পয়েন্টার, বেস পয়েন্টার, উত্স সূচক, গন্তব্য সূচক)। একই পদ্ধতিটি অন্যান্য অপারেটরগুলির জন্যও ব্যবহৃত হয়েছিল, উদাহরণস্বরূপ mov someRegister, immediateসেট। একটি উপায়ে, আপনি এটিকে ভাবতে পারেন যেমন ওপকোডটি আসলে একটি পূর্ণ বাইট না - শেষ কয়েকটি বিটগুলি "আসল" অপারেন্ডের "যুক্তি"।

এই সব বলেছিল, x86-এ, nopসম্ভবত একটি বাস্তব নির্দেশ হিসাবে বিবেচিত হবে, না। আসল মাইক্রো-আর্কিটেকচার এটিকে বৈকল্পিক হিসাবে বিবেচনা করে xchgআমি যদি সঠিকভাবে স্মরণ করি তবে এটি nopনির্দিষ্টকরণে আসলে নামকরণ করা হয়েছিল। এবং যেহেতু xchg ax, axকোনও নির্দেশনা সত্যই বোঝায় না, তাই আপনি দেখতে পাচ্ছেন 0x90যে ৮০ design of এর ডিজাইনাররা ট্রানজিস্টর এবং পথনির্দেশগুলিতে নির্দেশকে ডিকোডিংয়ে কীভাবে সংরক্ষণ করেছেন যে প্রাকৃতিকভাবে "নোপি" এমন কোনও স্থানে মানচিত্রটি ব্যবহার করে ।

অন্যদিকে, i8051 nop- এর জন্য সম্পূর্ণ ডিজাইন-ইন অপকড রয়েছে 0x00। কিন্ডা ব্যবহারিক। নির্দেশ নকশা মূলত অপারেশন জন্য উচ্চ মৃদু কামড় এবং operands নির্বাচনের জন্য কম মৃদু কামড় ব্যবহার করছে - উদাহরণস্বরূপ, add aহয় 0x2Y, এবং 0xX8মানে হলো "রেজিস্টার করো 0 সরাসরি" তে, তাই 0x28হয় add a, r0। সিলিকনে অনেক সঞ্চয় করে :)

আমি তখনও যেতে পারলাম, যেহেতু সিপিইউ ডিজাইন (সংকলক নকশা এবং ভাষার নকশার উল্লেখ না করা) বেশ বিস্তৃত বিষয়, তবে আমি মনে করি যে আমি অনেকগুলি ভিন্ন দৃষ্টিভঙ্গি প্রদর্শন করেছি যা ডিজাইনের মতো রয়েছে বেশ সুন্দরভাবে।


আসলে, NOPসাধারণত একটি ওরফে হয় MOV ax, ax, ADD ax, 0বা অনুরূপ নির্দেশাবলী। আপনি কেন এমন একটি নিবেদিত নির্দেশনা ডিজাইন করবেন যা প্রচুর পরিমাণে না থাকলে কিছুই হয় না।
দিমিত্রি গ্রিগরিয়েভ

@ দিমিত্রিগ্রিরিভ যা সত্যই সিপিইউ ভাষার নকশায় চলেছে (ভাল, মাইক্রো-আর্কিটেকচার)। বেশিরভাগ সিপিইউ (এবং সংকলক) MOV ax, axদূরে অপ্টিমাইজ করার ঝোঁক করবে ; NOPকার্যকর করার জন্য সর্বদা একটি নির্দিষ্ট পরিমাণ চক্র থাকবে। তবে আমি দেখতে পাই না যে আমি যাইহোক আমার উত্তরে যা লিখেছি তার সাথে এটি কীভাবে প্রাসঙ্গিক।
লুয়ান

সিপিইউগুলি সত্যই MOV ax, axদূরে অনুকূলিত করতে পারে না , কারণ তারা জানবে যে এটি MOVকোনও নির্দেশ ইতিমধ্যে পাইপলাইনে রয়েছে।
দিমিত্রি গ্রিগরিয়েভ

@ দিমিত্রিগ্রিরিভ যা আপনি যে ধরনের সিপিইউর কথা বলছেন তা নির্ভর করে। আধুনিক ডেস্কটপ সিপিইউগুলি কেবল পাইপলাইনের নির্দেশ নয়, প্রচুর স্টাফ করে। উদাহরণস্বরূপ, সিপিইউ জানে এটি ক্যাশে লাইন ইত্যাদির অকার্যকর করতে হবে না, এটি জানে এটি আসলে কিছু করতে হয় না (হাইপারথ্রেডিংয়ের জন্য, এমনকি সাধারণভাবে জড়িত একাধিক পাইপগুলির জন্যও)। আমি suprised হবে না যদি এটা শাখা ভবিষ্যদ্বাণী প্রভাবিত (যদিও যে সম্ভবত একই হবে NOPএবং MOV ax, ax)। আধুনিক সিপিইউগুলি পুরাতন স্কুল সি
সংকলকগুলির

1
কাউকেই কাউকে অনুকূলিতকরণের জন্য +1! আমি মনে করি আমাদের সকলকে একত্রিত হওয়া উচিত এবং বানানের এই স্টাইলে ফিরে যাওয়া উচিত! জেড 80 (এবং পরিবর্তে 8080) এর 7 টি LD r, rনির্দেশনা রয়েছে যেখানে rকোনও MOV ax, axনির্দেশ নেই আপনার নির্দেশের মতোই similar এটি 7 এবং 8 নয় এর কারণ হ'ল নির্দেশাবলীর একটি হ'ল অতিরিক্ত বোঝা HALT। সুতরাং 8080 এবং Z80 এর কমপক্ষে 7 টি অন্যান্য নির্দেশাবলী রয়েছে যা একই রকম হয় NOP! আকর্ষণীয়ভাবে যথেষ্ট, যদিও এই নির্দেশাবলী যুক্তিযুক্তভাবে বিট প্যাটার্নের সাথে সম্পর্কিত না হলেও তারা সকলেই 4 টি রাষ্ট্র কার্যকর করতে 4 টি রাষ্ট্র গ্রহণ করে তাই LDনির্দেশাবলী ব্যবহারের কোনও কারণ নেই !
সিজে ডেনিস

5

70 এর দশকের শেষের দিকে, আমাদের (তখন আমি একজন তরুণ গবেষক ছাত্র ছিলাম) একটি সামান্য ডিভ সিস্টেম ছিল (মেমরিটি যদি 8080 থাকে) যা কোডের 1024 বাইটে (যেমন একটি একক UVEPROM) চলেছিল - এটি লোড করার জন্য কেবল চারটি কমান্ড ছিল (এল ), সংরক্ষণ করুন (এস), মুদ্রণ (পি) এবং অন্য কিছু যা আমি মনে করতে পারি না। এটি একটি বাস্তব টেলি টাইপ এবং পাঞ্চ টেপ দিয়ে চালিত হয়েছিল। এটা শক্ত করে কোড করা হয়েছিল!

এনওওপি ব্যবহারের একটি উদাহরণ একটি বিঘ্নিত পরিষেবা রুটিনে (আইএসআর) ছিল, যা 8 বাইট অন্তর ব্যবধানে ছিল। এই রুটিনটি 9 বাইট দীর্ঘ হয়ে শেষ হয় ঠিকানার জায়গার সামান্য আরও একটি ঠিকানায় (দীর্ঘ) লাফ দিয়ে। এর অর্থ, ছোট এন্ডিয়ান বাইট অর্ডার দিয়ে বোঝানো হয়েছিল যে উচ্চ ঠিকানা বাইটটি 00 ঘন্টা, এবং পরবর্তী আইএসআরের প্রথম বাইটে বিভক্ত, যার অর্থ এটি (পরবর্তী আইএসআর) NOOP দিয়ে শুরু হয়েছিল, কেবল 'আমরা' ফিট করতে পারি সীমিত জায়গায় কোড!

সুতরাং এনওওপি দরকারী। এছাড়াও, আমি সন্দেহ করি যে এটি ইন্টেলের পক্ষে সেভাবে কোড করা সহজ ছিল - তাদের সম্ভবত তারা যে নির্দেশাবলীর প্রয়োগ করতে চেয়েছিল তাদের একটি তালিকা ছিল এবং এটি সমস্ত তালিকা অনুসারে '1' থেকে শুরু হয়েছিল (এটি ফরটারনের দিন ছিল), তাই শূন্য NOOP কোড একটি ফল আউট হয়ে যায়। (আমি কোনও নিবন্ধ কখনই দেখিনি যে একটি এনওওপি কম্পিউটিং সায়েন্স তত্ত্বের একটি প্রয়োজনীয় অঙ্গ (একই প্রশ্ন: গণিতবিদরা কি গ্রুপ তত্ত্বের শূন্যের থেকে পৃথক?)


সমস্ত সিপিইউতে 0x00 এ এনওপি এনকোড থাকে না (যদিও 8085, 8080 এবং সিপিইউ যার সাথে আমি সর্বাধিক পরিচিত, Z80, সবই করি)। তবে, আমি যদি এমন একটি প্রসেসর ডিজাইন করতাম যেখানে আমি এটি রেখেছিলাম! আর কিছু সহজ যা হ'ল মেমোরিটি সাধারণত 0x00 থেকে শুরু করা হয় তাই সিপিইউ অ-জিরোড মেমরি না পৌঁছানো পর্যন্ত কোড হিসাবে এটি কার্যকর করা কিছুই করবে না।
সিজে ডেনিস

@CJDennis কেন এক্স 86 সিপিইউ ব্যবহার করবেন না আমি ব্যাখ্যা করেছি 0x00জন্য nopআমার উত্তর হবে। সংক্ষেপে, এটি নির্দেশের ডিকোডিংয়ের উপর সংরক্ষণ করে - নির্দেশটি ডিকোডিংয়ের xchg ax, axযেভাবে কাজ করে তা প্রাকৃতিকভাবে প্রবাহিত হয় এবং এটি "নপি" কিছু করে, তাই কেন এটি ব্যবহার না করে এটিকে ডাকবেন, তাই না nop? :) নির্দেশনা ডিকোডিংয়ের জন্য সিলিকনে বেশ কিছুটা সঞ্চয়
করতেন

5

কিছু স্থাপত্যগুলিতে NOPঅব্যবহৃত দেরি স্লট দখল করতে ব্যবহৃত হয় । উদাহরণস্বরূপ, যদি শাখার নির্দেশনা পাইপলাইনটি সাফ না করে তবে তা কার্যকর করার পরে বেশ কয়েকটি নির্দেশাবলী:

 JMP     .label
 MOV     R2, 1    ; these instructions start execution before the jump
 MOV     R2, 2    ; takes place so they still get executed

তবে যদি আপনার পরে কোনও উপযুক্ত নির্দেশিকা না থাকে তবে কী হবে JMP? সেক্ষেত্রে আপনাকে NOPএস ব্যবহার করতে হবে ।

বিলম্ব স্লট জাম্পের মধ্যে সীমাবদ্ধ নয়। কিছু স্থাপত্যে, সিপিইউ পাইপলাইনে ডেটা বিপত্তিগুলি স্বয়ংক্রিয়ভাবে সমাধান হয় না। এর অর্থ হ'ল প্রতিটি নির্দেশের পরে যা একটি নিবন্ধক সংশোধন করে সেখানে একটি স্লট রয়েছে যেখানে নিবন্ধটির নতুন মানটি অ্যাক্সেসযোগ্য নয়। পরবর্তী নির্দেশের যদি সেই মানটির প্রয়োজন হয় তবে স্লটটি একটি দ্বারা দখল করা উচিত NOP:

 ADD     R1, R1
 NOP               ; The new value of R1 is not ready yet
 ADD     R1, R3

এছাড়াও, কিছু শর্তসাপেক্ষ কার্যকরকরণ নির্দেশাবলী ( যদি-সত্য-মিথ্যা এবং অনুরূপ) প্রতিটি শর্তের জন্য স্লট ব্যবহার করে এবং যখন কোনও নির্দিষ্ট শর্তের সাথে কোনও ক্রিয়াকলাপ থাকে না, তখন এর স্লটটি একটি দ্বারা দখল করা উচিত NOP:

CMP     R0, R1       ; Compare R0 and R1, setting flags
ITF     GT           ; If-True-False on GT flag 
MOV     R3, R2       ; If 'greater than', move R2 to R3
NOP                  ; Else, do nothing

+1 টি। অবশ্যই, কেবলমাত্র সেইগুলি আর্কিটেকচারগুলিতে প্রদর্শিত হবে যা পিছনের সামঞ্জস্যের বিষয়ে চিন্তা করে না - নির্দেশ পাইপলিনিং প্রবর্তনের সময় x86 যদি এমন কিছু চেষ্টা করে তবে প্রায় সকলেই এটিকে ভুল হিসাবে ডেকে আনে (সর্বোপরি, তারা কেবল তাদের সিপিইউ আপগ্রেড করে এবং তাদের অ্যাপ্লিকেশন কাজ বন্ধ!)। সুতরাং x86 কে নিশ্চিত করতে হবে যে সিপিইউতে এই জাতীয় উন্নতি যুক্ত হওয়ার পরে অ্যাপ্লিকেশনটি লক্ষ্য করে না - যতক্ষণ না আমরা মাল্টি-কোর সিপিইউতে যাই না কেন ...: ডি
লুয়ান

2

দ্বি-বাইট এনওপি -র ব্যবহারের আরেকটি উদাহরণ : http://blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx

এমওভি ইডিআই, ইডিআই নির্দেশিকা একটি দ্বি-বাইট এনওপি, যা লাফের নির্দেশে প্যাচ করার জন্য পর্যাপ্ত জায়গা যাতে ফলকে ফ্লাইটিতে আপডেট করা যায়। উদ্দেশ্যটি হ'ল এমওভিটি ইডিআই, ইডিআই নির্দেশিকাটি ফাংশন শুরুর আগেই আসা প্যাচ স্পেসের পাঁচটি বাইটে নিয়ন্ত্রণ পুনর্নির্দেশের জন্য দুটি বাইট জেএমপি MP -5 নির্দেশকে প্রতিস্থাপন করা হবে। পুরো জাম্প নির্দেশের জন্য পাঁচ বাইটই যথেষ্ট, যা ঠিকানার জায়গায় অন্য কোথাও ইনস্টল করা প্রতিস্থাপন ফাংশনে নিয়ন্ত্রণ পাঠাতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.