এলইএ নির্দেশের উদ্দেশ্য কী?


676

আমার জন্য, এটি কেবল মজাদার এমওভিয়ের মতো মনে হচ্ছে। এর উদ্দেশ্য কী এবং আমি কখন এটি ব্যবহার করব?


2
ঠিকানা / পয়েন্টার নয় এমন মানগুলিতে এলইএ ব্যবহার করে দেখুন ? : এলইএ হ'ল একটি শিফট এবং অ্যাড নির্দেশিকা। এটি সম্ভবত 8086-এ যুক্ত করা হয়েছে কারণ ঠিকানাটি মোডগুলি ডিকোড করতে এবং গণনা করতে ইতিমধ্যে হার্ডওয়্যার রয়েছে, কারণ এটি কেবল ঠিকানাগুলি ব্যবহারের জন্য "উদ্দেশ্যে" নয়। মনে রাখবেন যে পয়েন্টারগুলি সমাবেশে কেবল পূর্ণসংখ্যা হয়।
পিটার কর্ডেস

উত্তর:


798

যেমনটি অন্যরা উল্লেখ করেছে, এলইএ (লোড কার্যকর ঠিকানা) প্রায়শই নির্দিষ্ট গণনা করতে একটি "কৌশল" হিসাবে ব্যবহৃত হয়, তবে এটি এর প্রাথমিক উদ্দেশ্য নয়। X86 নির্দেশিকা সেটটি পাস্কাল এবং সি এর মতো উচ্চ-স্তরের ভাষার জন্য ডিজাইন করা হয়েছিল, যেখানে অ্যারেগুলি - বিশেষত ইনট বা ছোট স্ট্রাকের অ্যারেগুলি সাধারণ। উদাহরণস্বরূপ, একটি কাঠামো (x, y) স্থানাঙ্কগুলি বিবেচনা করুন:

struct Point
{
     int xcoord;
     int ycoord;
};

এখন একটি বিবৃতি কল্পনা করুন:

int y = points[i].ycoord;

যেখানে points[]একটি অ্যারে হয় Point। অ্যারের বেস ধরে নেওয়া যাক আগে থেকেই EBX, এবং পরিবর্তনশীল iরয়েছে EAX, এবং xcoordএবং ycoordপ্রতিটি 32 বিট (তাই হয় ycoordstruct অনেক অফসেট 4 বাইট এ করা হয়), এই বিবৃতি কম্পাইল করা যেতে পারে:

MOV EDX, [EBX + 8*EAX + 4]    ; right side is "effective address"

যা অবতরণ করবে yমধ্যে EDX। 8 এর স্কেল ফ্যাক্টর কারণ প্রতিটি Pointআকার 8 বাইট হয়। এখন "ঠিকানা" অপারেটরের সাথে ব্যবহৃত একই অভিব্যক্তিটি বিবেচনা করুন এবং:

int *p = &points[i].ycoord;

এই ক্ষেত্রে, আপনি এর মান চান না ycoord, তবে এটির ঠিকানা। যে যেখানে আছে LEA(লোড কার্যকর ঠিকানা) আসে। একটি পরিবর্তে MOV, কম্পাইলার তৈরি করতে পারেন

LEA ESI, [EBX + 8*EAX + 4]

যা ঠিকানা লোড করবে ESI


112
movনির্দেশিকাটি বাড়ানো এবং বন্ধনীগুলি ছেড়ে দেওয়া কি ক্লিনার না হত ? MOV EDX, EBX + 8*EAX + 4
নাটান ইয়েলিন

14
@ আইম্যাকেক একটি বিশেষায়িত এমওভির সাথে এলইএ প্রতিস্থাপন করে আপনি সিনট্যাক্সটি পরিষ্কার রাখেন: [] বন্ধনীগুলি সর্বদা সিতে পয়েন্টারকে ডিফারেন্স করার সমতুল্য হয় বন্ধনী ব্যতীত, আপনি সর্বদা পয়েন্টারটি নিজেই ডিল করেন।
নাটান ইয়েলিন

139
কোনও এমওভি নির্দেশে গণিত করা (EBX + 8 * EAX + 4) বৈধ নয়। এলইএ ইএসআই, [ইবিএক্স + 8 * ইএক্স +4] বৈধ কারণ এটি একটি অ্যাড্রেসিং মোড যা x86 সমর্থন করে। en.wikedia.org/wiki/X86# অ্যাড্রেসিং_মোডস
এরিক

29
@ জোনাথন ডিকিনসন এলইএ MOVএকটি পরোক্ষ উত্সের মতো, এটি কেবল ইন্ডিয়ারেশন দেয় এবং না করেই MOV। এটি আসলে গণনা করা ঠিকানা থেকে পড়ে না , কেবল এটি গণনা করে।
hobbs

24
এরিক, ট্যুর মন্তব্য সঠিক নয়। মোভ ইক্স, [ইবিএক্স + 8 * ইকেক্স + 4] বৈধ। তবে
এমওভির ত্রয়োদশ

562

আবরাশের রচনা "জেন অফ জেন" থেকে :

LEA, একমাত্র নির্দেশ যা মেমরি সম্বোধনের গণনা সম্পাদন করে তবে মেমরিটিকে আসলে সম্বোধন করে না। LEAএকটি স্ট্যান্ডার্ড মেমরি অ্যাড্রেসিং অপারেন্ড গ্রহণ করে, তবে নির্দিষ্ট রেজিস্টারে গণিত মেমরি অফসেট সংরক্ষণ করা ছাড়া আর কিছুই করে না, যা কোনও সাধারণ উদ্দেশ্য নিবন্ধ হতে পারে।

আমাদের কী দেয়? দুটি জিনিস যা সরবরাহ ADDকরে না:

  1. দুটি বা তিনটি অপারেন্ডের সাথে সংযোজন করার ক্ষমতা এবং
  2. যে কোনও রেজিস্টারে ফলাফল সংরক্ষণের ক্ষমতা ; শুধুমাত্র উত্স অপারেশন এক।

এবং LEAপতাকাগুলি পরিবর্তন করে না।

উদাহরণ

  • LEA EAX, [ EAX + EBX + 1234567 ]গণনা করে EAX + EBX + 1234567(এটি তিনটি অপারেশন)
  • LEA EAX, [ EBX + ECX ]EBX + ECXফলাফলের সাথে ওভাররাইড না করে গণনা করে।
  • ধ্রুবক দ্বারা গুণন (দুই, তিন, পাঁচ বা নয় দ্বারা), আপনি যদি এটির মতো ব্যবহার করেন LEA EAX, [ EBX + N * EBX ](এন 1,2,4,8 হতে পারে)।

অন্যান্য usecase লুপ মধ্যে কুশলী হল: মধ্যে পার্থক্য LEA EAX, [ EAX + 1 ]এবং INC EAXযে আধুনিক পরিবর্তন হয় EFLAGSকিন্তু সাবেক না; এই CMPরাষ্ট্র সংরক্ষণ করে ।


42
কিছু উদাহরণ @AbidRahmanK: LEA EAX, [ EAX + EBX + 1234567 ]সমষ্টি হিসাব করে EAX, EBXএবং 1234567(যে তিন operands এর)। LEA EAX, [ EBX + ECX ]হিসাব EBX + ECX ছাড়া ফলাফল নিয়ে পারেন অগ্রাহ্য। তৃতীয় জিনিসটি LEA(ফ্র্যাঙ্ক দ্বারা তালিকাভুক্ত নয়) এর জন্য ব্যবহৃত হয় হ'ল ধ্রুবক দ্বারা দ্বিগুণ (দুটি, তিন, পাঁচ বা নয় দ্বারা), যদি আপনি এটি ব্যবহার করেন LEA EAX, [ EBX + N * EBX ]( N1,2,4,8 হতে পারে) like অন্যান্য usecase লুপ মধ্যে কুশলী হল: মধ্যে পার্থক্য LEA EAX, [ EAX + 1 ]এবং INC EAXযে আধুনিক পরিবর্তন হয় EFLAGSকিন্তু সাবেক না; এই CMPরাষ্ট্র সংরক্ষণ করে
ফ্র্যাঙ্কএইচ।

@FrankH। আমি এখনও বুঝতে পারি না, তাই এটি অন্য কোথাও একটি পয়েন্টার লোড করে?

6
@ ripDaddy69 হ্যাঁ, বাছাই করুন - যদি "বোঝা" দ্বারা আপনার বোঝানো হয় "ঠিকানা গণনা / পয়েন্টার গাণিতিকগুলি সম্পাদন করে"। এটি মেমোরিতে অ্যাক্সেস করে না (যেমন সি প্রোগ্রামিংয়ের পদগুলিতে এটি ডাকা হবে বলে পয়েন্টারটি "শ্রদ্ধা" নয়)।
ফ্র্যাঙ্কএইচ।

2
+1: এটি কী ধরণের 'কৌশল' LEAব্যবহার করতে পারে তা স্পষ্ট করে তোলে ... (দেখুন "এলইএ (কার্যকর ঠিকানা লোড করুন) উপরের আইজে কেনেডি-র জনপ্রিয় উত্তরে" নির্দিষ্ট গণনা করতে "কৌশল হিসাবে ব্যবহৃত হয়)
আসাদ ইব্রাহিম

3
2 অপারেন্ড এলইএ যা দ্রুত এবং 3 অপরেন্ড এলইএ যা ধীর গতির মধ্যে একটি বড় পার্থক্য রয়েছে। ইন্টেল অপটিমাইজেশন ম্যানুয়াল বলছে দ্রুত পথ এলইএ একক চক্র এবং স্লো পাথ এলইএ তিনটি চক্র নেয়। তদুপরি, স্কাইলেকে দুটি দ্রুত পথের কার্যকরী ইউনিট রয়েছে (পোর্ট 1 এবং 5) এবং কেবলমাত্র একটি ধীর পাথ কার্যকরী ইউনিট (পোর্ট 1) রয়েছে। ম্যানুয়ালটিতে বিধানসভা / সংকলক কোডিং বিধি 33 এমনকি 3 অপরেন্ড এলইএ ব্যবহার করার বিরুদ্ধে সতর্ক করে।
ওলসনিস্ট

110

LEAনির্দেশের আরেকটি গুরুত্বপূর্ণ বৈশিষ্ট্য হ'ল এটি শর্তের কোডগুলিতে যেমন পরিবর্তন করে না CFএবং যেমন ZFপাটিগণিত নির্দেশাবলীর দ্বারা ঠিকানাটি গণনা করার সময় ADDবা MULকরে। এই বৈশিষ্ট্যটি নির্দেশাবলীর মধ্যে নির্ভরতার মাত্রা হ্রাস করে এবং এইভাবে সংকলক বা হার্ডওয়্যার সিডিউলারের দ্বারা আরও অনুকূলকরণের সুযোগ করে দেয়।


1
হ্যাঁ, leaকখনও কখনও সংকলক (বা মানব কোডার) কোনও পতাকা ফলাফলকে ক্লোবার্ব না করে গণিত করতে দরকারী। তবে এর leaচেয়ে দ্রুত নয় add। বেশিরভাগ x86 নির্দেশাবলী পতাকা লিখেছে। উচ্চ-কার্যকারিতা x86 বাস্তবায়নগুলিকে EFLAGS এর নাম পরিবর্তন করতে হবে বা অন্যথায় স্বাভাবিক কোডটি দ্রুত চালানোর জন্য লেখার পরে লেখার ঝুঁকি এড়াতে হবে, সুতরাং পতাকা লেখাগুলি এড়ানো নির্দেশাবলী সেই কারণে ভাল নয়। ( আংশিক ফ্ল্যাগ স্টাফগুলি বিষয়গুলি তৈরি করতে পারে, আইএনসি নির্দেশনা বনাম এডিডি 1 দেখুন: এতে কী আসে যায়? )
পিটার কর্ডেস

2
@ পিটারকর্ডস: এটি এখানে আনার ঘৃণা তবে - আমি কি এই নতুন [x86-lea] ট্যাগটি অতিরিক্ত বা অপ্রয়োজনীয় ভাবতে একা রয়েছি?
মাইকেল পেচ

2
@ মিশেলপ্যাচ: হ্যাঁ, আমি মনে করি এটি খুব নির্দিষ্ট। এটি মেশিনের ভাষা বোঝে না এমন শিথিলকে বিভ্রান্ত বলে মনে হচ্ছে এবং সমস্ত কিছু (পয়েন্টার সহ) কেবল বিট / বাইট / পূর্ণসংখ্যা, তাই বিপুল সংখ্যক ভোট নিয়ে এটি নিয়ে প্রচুর প্রশ্ন রয়েছে। তবে এটির জন্য একটি ট্যাগ থাকা বোঝায় যে ভবিষ্যতের প্রশ্নগুলির একটি মুক্ত-সমাপ্ত সংখ্যার জায়গা রয়েছে, যখন বাস্তবে প্রায় 2 বা 3 টি মোট নকল নয় ates (? এটা কি কিভাবে পূর্ণসংখ্যার গুন জন্য এটি ব্যবহার করতে এবং কীভাবে বনাম Alus Agus উপর অভ্যন্তরীণভাবে রান এবং সঙ্গে কি লেটেন্সি / থ্রুপুট হয়তো হয়েছে "অভিপ্রেত" উদ্দেশ্য?।)
পিটার Cordes

@ পিটারকর্ডস: আমি সম্মত, এবং এই সমস্ত পোস্ট সম্পাদনা করা হলেও উপস্থিত এলইএ সম্পর্কিত কয়েকটি প্রশ্নের সদৃশ। ট্যাগের পরিবর্তে যে কোনও সদৃশ চিহ্নিত করতে হবে এবং imho চিহ্নিত করতে হবে।
মাইকেল পেচ

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

93

সমস্ত ব্যাখ্যা থাকা সত্ত্বেও এলইএ একটি পাটিগণিত অপারেশন:

LEA Rt, [Rs1+a*Rs2+b] =>  Rt = Rs1 + a*Rs2 + b

শিফট + অ্যাড অপারেশনের জন্য এটির নাম চূড়ান্তভাবে বোকা। এর কারণটি ইতিমধ্যে শীর্ষ রেটে দেওয়া উত্তরগুলিতে ব্যাখ্যা করা হয়েছিল (যেমন এটি সরাসরি উচ্চ স্তরের মেমরি রেফারেন্সগুলি ম্যাপ করার জন্য তৈরি করা হয়েছিল)।


8
এবং পাটিগণিতটি সম্পাদনা-গণনা হার্ডওয়্যার দ্বারা সম্পাদিত হয়।
বেন ভয়েগট

30
@ বেনভয়েগ আমি বলতাম যে, কারণ আমি একটি পুরানো ব্লোক :-) Traতিহ্যগতভাবে, x86 সিপিইউগুলি এর জন্য ঠিকানা ইউনিট ব্যবহার করেছে, তাতে একমত হয়েছে। তবে "বিচ্ছেদ" আজকাল খুব ঝাপসা হয়ে গেছে। কিছু সিপিইউ আর মোটামুটি এজিইউ ডেডিকেটেড করে না, অন্যরা এজিইউগুলিতে চালিত না LEAকরে সাধারণ পূর্ণসংখ্যার এএলইউতে বেছে নিয়েছে । "স্টাফ কোথায় চলছে" তা খুঁজে পেতে
একজনকে আজকাল

2
@ ফ্র্যাঙ্কএইচ: আউট-অফ-অর্ডার সিপিইউগুলি সাধারণত এলএইউগুলিতে এলইএ চালায়, যখন কিছু ইন-অর্ডার সিপিইউ (অ্যাটমের মতো) কখনও কখনও এটি এজিইউতে চালায় (কারণ তারা মেমরি অ্যাক্সেস পরিচালনা করতে ব্যস্ত থাকতে পারে না)।
পিটার কর্ডেস

3
না, নামটি বোকা নয়। LEAআপনাকে এমন ঠিকানা দেয় যা স্মৃতি সম্পর্কিত কোনও অ্যাড্রেসিং মোড থেকে উদ্ভূত হয়। এটি কোনও শিফট এবং অ্যাড অপারেশন নয়।
কাজ

3
এফইউডব্লিউআইডাব্লুতে খুব কম বর্তমান (যদি থাকে) এক্সজি-তে অপারেশন করে এমন x86 সিপিইউ রয়েছে। বেশিরভাগ বা সমস্তই অন্য কোনও পাটিগণিতের মত একটি ALU ব্যবহার করে।
BeeOnRope

77

এলইএ নির্দেশনা সম্পর্কে সম্ভবত অন্য একটি জিনিস। 3, 5 বা 9 দ্বারা দ্রুত গুণনের নিবন্ধগুলির জন্য আপনি এলইএ ব্যবহার করতে পারেন।

LEA EAX, [EAX * 2 + EAX]   ;EAX = EAX * 3
LEA EAX, [EAX * 4 + EAX]   ;EAX = EAX * 5
LEA EAX, [EAX * 8 + EAX]   ;EAX = EAX * 9

13
কৌতুক জন্য +1। তবে আমি একটি প্রশ্ন জিজ্ঞাসা করতে চাই (নির্বোধ হতে পারে), কেন এই জাতীয় তিনটি দিয়ে সরাসরি গুণ করবেন না LEA EAX, [EAX*3]?
আবিদ রহমান কে

13
@ আবিদ রহমান কে: নির্দেশনা আনড x86 সিপিইউ নির্দেশের মতো সেট নেই।
জিজে

50
ইবিডআরহমানক ইন্টেল অ্যাস্যাম সিনট্যাক্স সত্ত্বেও এটিকে একটি গুণকের মতো দেখায়, লি নির্দেশিকাটি কেবল শিফট অপারেশনগুলিকে এনকোড করতে পারে। ওপকোডে শিফটটি বর্ণনা করার জন্য 2 টি বিট রয়েছে, সুতরাং আপনি কেবল 1,2,4 বা 8 দিয়ে গুণ করতে পারবেন
ithkuil

6
@ কোরে টুগাই: আপনি shlরেজিস্টারগুলি 2,4,8,16 দ্বারা গুণনের জন্য বাম দিকের শিফ্টের মতো নির্দেশ ব্যবহার করতে পারেন ... এটি দ্রুত এবং খাটো। তবে 2 এর শক্তির বিভিন্ন সংখ্যার সাথে সংখ্যাবৃদ্ধির জন্য আমরা সাধারণত mulনির্দেশাবলী ব্যবহার করি যা আরও বেশি ভ্রান্ত ও ধীর।
জিজে

7
@GJ। যদিও এ জাতীয় কোনও এনকোডিং নেই, কিছু সংশ্লেষকরা এটি শর্টকাট হিসাবে গ্রহণ করে, যেমন ফাস্টম fas সুতরাং যেমন এর lea eax,[eax*3]সমতুল্য অনুবাদ করবে lea eax,[eax+eax*2]
রুসলান

59

lea"লোড কার্যকর ঠিকানা" এর একটি সংক্ষেপণ। এটি উত্স অপারেন্ড দ্বারা গন্তব্য অপারেন্ডে অবস্থানের রেফারেন্সের ঠিকানাটি লোড করে। উদাহরণস্বরূপ, আপনি এটি ব্যবহার করতে পারেন:

lea ebx, [ebx+eax*8]

একক নির্দেশ দিয়ে ebxপয়েন্টার eaxআইটেমগুলি আরও সরানো (64৪-বিট / উপাদান অ্যারেতে)। মূলত, আপনি পয়েন্টারগুলিকে দক্ষতার সাথে পরিচালনা করতে x86 আর্কিটেকচার দ্বারা সমর্থিত জটিল ঠিকানা মোডগুলি থেকে উপকৃত হন benefit


23

আপনি এটিকে ব্যবহার LEAকরার সবচেয়ে বড় কারণ MOVহ'ল যদি আপনি ঠিকানাটি গণনা করতে ব্যবহার করা নিবন্ধগুলিতে পাটিগণিত সম্পাদন করতে হয়। কার্যকরভাবে, আপনি কার্যকরভাবে "ফ্রি" এর জন্য একাধিক নিবন্ধগুলিতে পয়েন্টার গাণিতিকের পরিমাণটি সম্পাদন করতে পারেন।

এটি সম্পর্কে আসলেই বিভ্রান্তিকর বিষয়টি হ'ল আপনি সাধারণত একটি LEAঠিক তেমন একটি লেখেন MOVতবে আপনি আসলে স্মৃতিটিকে অবনমিত করছেন না। অন্য কথায়:

MOV EAX, [ESP+4]

এটি কোন ESP+4বিষয়গুলিতে পয়েন্ট দেয় সেগুলির বিষয়বস্তু সরানো হবে EAX

LEA EAX, [EBX*8]

এটি কার্যকর ঠিকানাটি EBX * 8EAX এ স্থানান্তরিত করবে, সেই জায়গাতে পাওয়া যায় না। আপনি দেখতে পাচ্ছেন, এছাড়াও, দুটি (স্কেলিং) এর গুণাবলী দ্বারা গুণিত করা সম্ভব যখন ক MOVযোগ / বিয়োগের মধ্যে সীমাবদ্ধ।


সবাইকে দুঃখিত। @ বিগ.হর্ট আমাকে তিন ঘন্টা আগে এর জবাব দিয়ে আমার বোকা বানিয়েছিল, আমার বিধানসভা প্রশ্ন উত্থাপনে এটি "নতুন" হিসাবে দেখানো হয়েছে।
ডেভিড হোলজার

1
সিনট্যাক্স যখন মেমরি অ্যাড্রেসিং না করে তখন বন্ধনীগুলি কেন ব্যবহার করে?
গোলাপট

3
@ q4w56 এই উত্তরগুলির মধ্যে এইগুলির মধ্যে একটি, "এটি আপনি ঠিক এভাবেই করেন।" আমি বিশ্বাস করি এটি কারণগুলির মধ্যে একটি কারণ যে লোকেরা কী করতে পারে তা নির্ধারণের জন্য এত কঠিন সময় কাটায় LEA
ডেভিড হোলজার

2
@ q4w56: এটি একটি শিফট + যুক্ত নির্দেশ যা মেমরি অপারেণ্ড সিনট্যাক্স এবং মেশিন-কোড এনকোডিং ব্যবহার করে। কিছু সিপিইউতে এটি এমনকি এজিইউ হার্ডওয়্যার ব্যবহার করতে পারে তবে এটি একটি historicalতিহাসিক বিবরণ। এখনও প্রাসঙ্গিক সত্যটি হ'ল ডিকোডার হার্ডওয়্যার এই ধরণের শিফট + অ্যাড ডিকোড করার জন্য ইতিমধ্যে উপস্থিত রয়েছে এবং এলইএ আমাদের স্মৃতি সম্বোধনের পরিবর্তে পাটিগণিতের জন্য এটি ব্যবহার করতে দেয়। (বা ঠিকানার গণনার জন্য যদি কোনও ইনপুট আসলে পয়েন্টার হয়)।
পিটার কর্ডস

20

8086 এর একটি বৃহত্তর নির্দেশিকা রয়েছে যা একটি রেজিস্টার অপারেন্ড এবং একটি কার্যকর ঠিকানা গ্রহণ করে, সেই কার্যকর ঠিকানার অফসেট অংশ গণনা করার জন্য কিছু গণনা সম্পাদন করে এবং নিবন্ধক এবং গণনা করা ঠিকানার দ্বারা উল্লেখ করা মেমরির সাথে জড়িত কিছু অপারেশন সম্পাদন করে। প্রকৃত স্মৃতি ক্রিয়াকলাপটি বাদ দেওয়া ছাড়া সেই পরিবারের যে কোনও একটি নির্দেশ উপরোক্তরূপে আচরণ করা মোটামুটি সহজ ছিল। এটি, নির্দেশাবলী:

mov ax,[bx+si+5]
lea ax,[bx+si+5]

প্রায় একইভাবে অভ্যন্তরীণভাবে প্রয়োগ করা হয়েছিল। পার্থক্যটি একটি এড়ানো পদক্ষেপ। উভয় নির্দেশাবলী এমন কিছু কাজ করে:

temp = fetched immediate operand (5)
temp += bx
temp += si
address_out = temp  (skipped for LEA)
trigger 16-bit read  (skipped for LEA)
temp = data_in  (skipped for LEA)
ax = temp

কেন ইন্টেল এই নির্দেশকে অন্তর্ভুক্ত করার জন্য মূল্যবান বলে মনে করেছিল, আমি ঠিক নিশ্চিত নই, তবে বাস্তবায়নে সস্তা যে সত্য ছিল এটি একটি বড় কারণ হতে পারে। আরেকটি কারণ হ'ল ইন্টেলের এসেম্বলারের প্রতীকগুলি বিপি রেজিস্টারের সাথে সম্পর্কিত হতে পারে। যদি fnordকোনও বিপি-আপেক্ষিক প্রতীক হিসাবে চিহ্নিত করা হয় (যেমন বিপি + 8), কেউ বলতে পারেন:

mov ax,fnord  ; Equivalent to "mov ax,[BP+8]"

কেউ যদি কোনও বিপি-আপেক্ষিক ঠিকানায় ডেটা সঞ্চয় করতে স্টসওয়ের মতো কিছু ব্যবহার করতে চান, বলতে সক্ষম হচ্ছেন

mov ax,0 ; Data to store
mov cx,16 ; Number of words
lea di,fnord
rep movs fnord  ; Address is ignored EXCEPT to note that it's an SS-relative word ptr

এর চেয়ে সুবিধাজনক ছিল:

mov ax,0 ; Data to store
mov cx,16 ; Number of words
mov di,bp
add di,offset fnord (i.e. 8)
rep movs fnord  ; Address is ignored EXCEPT to note that it's an SS-relative word ptr

নোট করুন যে বিশ্বকে "অফসেট" ভুলে যাওয়া অবস্থানের বিষয়বস্তু [বিপি + 8] এর পরিবর্তে ডিআইতে যোগ করা হবে 8 উফ।


12

উল্লিখিত বিদ্যমান উত্তরের হিসাবে, LEAস্মৃতি অ্যাক্সেস না করে পাটিগণিতকে সম্বোধন করার মেমরি সম্পাদন করার সুবিধা রয়েছে, অ্যাডিশনের সাধারণ ফর্মের পরিবর্তে পাটিগণিত ফলাফলকে আলাদা রেজিস্টারে সংরক্ষণ করা saving আসল অন্তর্নিহিত পারফরম্যান্স সুবিধাটি হ'ল আধুনিক প্রসেসরের কার্যকরী ঠিকানা উত্পাদনের জন্য পৃথক এলইএএএএলএ ইউনিট এবং বন্দর রয়েছে ( LEAএবং অন্যান্য মেমরি রেফারেন্স ঠিকানা সহ ), এর অর্থ এটিএলইউতে পাটিগণিত অপারেশন LEAএবং অন্যান্য স্বাভাবিক গাণিতিক অপারেশন একের মধ্যে সমান্তরালে করা যেতে পারে মূল.

এলইএ ইউনিট সম্পর্কে কিছু বিশদ জানতে হ্যাসওয়েল আর্কিটেকচারের এই নিবন্ধটি দেখুন: http://www.realworldtech.com/haswell-cpu/4/

অন্য গুরুত্বপূর্ণ বিষয় যা অন্য উত্তরে উল্লেখ করা হয়নি তা LEA REG, [MemoryAddress]হ'ল পিআইসি (অবস্থান স্বতন্ত্র কোড) যা এই নির্দেশিকায় পিসির আপেক্ষিক ঠিকানা এনকোড করেMemoryAddress । এটি আলাদা MOV REG, MemoryAddressযা থেকে আপেক্ষিক ভার্চুয়াল ঠিকানা এনকোড করে এবং আধুনিক অপারেটিং সিস্টেমগুলিতে স্থান পরিবর্তন / প্যাচিংয়ের প্রয়োজন (যেমন ASLR সাধারণ বৈশিষ্ট্য)। সুতরাং LEAযেমন নন পিআইসিকে পিআইসিতে রূপান্তর করতে ব্যবহার করা যেতে পারে।


2
"পৃথক এলইএ ALU" অংশটি বেশিরভাগই অসত্য। আধুনিক সিপিইউ leaএকই সংখ্যক ALU গুলির মধ্যে এক বা একাধিকের উপর চালিত করে যা অন্যান্য গাণিতিক নির্দেশাবলী কার্যকর করে (তবে সাধারণত অন্যান্য গাণিতিকের তুলনায় এর চেয়ে কম)) উদাহরণস্বরূপ, উল্লিখিত হাসওয়েল সিপিইউ চারটি বিভিন্ন এএলইউতে কার্যকর addবা subবা অন্যান্য বেশ কয়েকটি বেসিক পাটিগণিত অপারেশন করতে পারে, তবে কেবলমাত্র একটি (জটিল ) বা দুটি (সাধারণ ) দিয়ে কার্যকর করতে পারে । আরও গুরুত্বপূর্ণ বিষয়, এই দুটি-সক্ষম যোগ্য এএলইউ হ'ল চারটির মধ্যে দুটি যা অন্য নির্দেশাবলী কার্যকর করতে পারে, তাই দাবি হিসাবে কোনও সমান্তরালতার সুবিধা নেই। lealealealea
BeeOnRope

আপনি যে নিবন্ধটি সংযুক্ত করেছেন (সঠিকভাবে) দেখায় যে এলইএ একই বন্দরে পূর্ণসংখ্যা ALU (অ্যাড / সাব / বুলিয়ান) এবং হাসওয়েলে পূর্ণসংখ্যার MUL ইউনিট রয়েছে। (এবং এফপি এডিডি / এমইউএল / এফএমএ সহ ভেক্টর ALUs)। কেবলমাত্র এলইএ ইউনিটটি পোর্ট 5 এ রয়েছে, যা এডিডি / এসইউবি / যা কিছু চালায় এবং ভেক্টর বদলানো এবং অন্যান্য সামগ্রী। আমি নিম্নমানের না হওয়ার একমাত্র কারণ হ'ল আপনি আরআইপি-আপেক্ষিক এলইএ (কেবলমাত্র x86-64 এর জন্য) ব্যবহারটি উল্লেখ করেছেন।
পিটার কর্ডস

8

এলইএর নির্দেশাবলী সিপিইউ দ্বারা কার্যকর ঠিকানার সময় গ্রহণের গণনা এড়াতে ব্যবহার করা যেতে পারে। যদি কোনও ঠিকানা বারবার ব্যবহার করা হয় তবে প্রতিবার কার্যকর ঠিকানাটি ব্যবহার করার পরিবর্তে এটি রেজিস্টারে সংরক্ষণ করা আরও কার্যকর।


অগত্যা আধুনিক x86 এ নয়। বেশিরভাগ অ্যাড্রেসিং মোডের কিছু খরচ রয়েছে একই সাথে কিছু ক্যাভেট। সুতরাং [esi]বলার চেয়ে কমই সস্তা [esi + 4200]এবং এটির তুলনায় খুব কমই সস্তা [esi + ecx*8 + 4200]
BeeOnRope

@BeeOnRope [esi]তুলনায় সস্তা নয় [esi + ecx*8 + 4200]। তবে তুলনা কেন বিরক্ত করবেন? তারা সমতুল্য নয়। আপনি যদি পূর্বেরটিকে একই হিসাবে মেমরির অবস্থানটি একই হিসাবে চিহ্নিত করতে চান তবে আপনাকে অতিরিক্ত নির্দেশাবলীর দরকার: আপনি 8 দ্বারা গুণিত esiমানটি যুক্ত করতে হবে ecxh আহা, গুণ আপনার সিপিইউ ফ্ল্যাগগুলি আঁকতে চলেছে! তারপরে আপনাকে 4200 টি যুক্ত করতে হবে These
কাজ

2
@ কাজ - আমি মনে করি আপনি আমার পয়েন্টটি মিস করছেন (না হলে আমি ওপিটির পয়েন্টটি মিস করেছি)। আমার বোধগম্যতা হল যে ওপি বলছে যে আপনি যদি [esi + 4200]নির্দেশের অনুক্রমে বারবার মতো কিছু ব্যবহার করতে চলেছেন তবে প্রথমে কার্যকর ঠিকানাটি একটি রেজিস্টারে লোড করা এবং এটি ব্যবহার করা ভাল। উদাহরণস্বরূপ, লেখার পরিবর্তে add eax, [esi + 4200]; add ebx, [esi + 4200]; add ecx, [esi + 4200]আপনার পছন্দ করা উচিত lea edi, [esi + 4200]; add eax, [edi]; add ebx, [edi]; add ecx, [edi], যা খুব কমই দ্রুত হয়। অন্তত এই উত্তরটির সরল ব্যাখ্যা interpretation
BeeOnRope

সুতরাং যে কারণে আমি তুলনা করছিলাম [esi]এবং [esi + 4200](বা [esi + ecx*8 + 4200]এটি হ'ল ওপি প্রস্তাবিত সরলকরণ) (আমি বুঝতে পারছি): একই জটিল ঠিকানা সহ এন নির্দেশাবলী সরল (একটি রেজি) সম্বোধন, আরও একটি lea, সহ এন নির্দেশিকায় রূপান্তরিত হয় , জটিল ঠিকানা হ'ল "সময় সাপেক্ষ"। বাস্তবে, এটি আধুনিক x86 এর চেয়েও ধীরে ধীরে, তবে কেবলমাত্র
অলসতা

1
সম্ভবত আপনি কিছু নিবন্ধকের চাপ থেকে মুক্তি দিয়েছেন, হ্যাঁ - তবে এর বিপরীতটি হতে পারে: আপনি যে কার্যকর ঠিকানাগুলি দিয়েছিলেন সেগুলি যদি লাইভ হয় তবে ফলাফলটি সংরক্ষণ করার জন্য আপনার অন্য একটি রেজিস্টার প্রয়োজন leaযাতে এটি সেই ক্ষেত্রে চাপ বাড়ে। সাধারণভাবে, মধ্যস্থতাকারীদের সংরক্ষণ করা নিবন্ধকের চাপের কারণ, এটির সমাধান নয় - তবে আমি মনে করি বেশিরভাগ পরিস্থিতিতে এটি ধোয়া। @ কাজ
বিওনরোপ

7

এলইএ (লোড ইফেক্টিভ অ্যাড্রেস) নির্দেশিকা ঠিকানা প্রাপ্তির একটি উপায় যা ইন্টেল প্রসেসরের কোনও মেমরি অ্যাড্রেসিং মোড থেকে উদ্ভূত হয়।

এটি বলতে গেলে, আমাদের যদি কোনও ডেটা স্থানান্তর থাকে তবে:

MOV EAX, <MEM-OPERAND>

এটি লক্ষ্য রেজিস্টারে মনোনীত মেমরি অবস্থানের সামগ্রীগুলি সরিয়ে দেয়।

যদি আমরা MOVবাই দ্বারা প্রতিস্থাপন করি LEA, তবে মেমরির অবস্থানের ঠিকানা ঠিক ঠিক একই পদ্ধতিতে <MEM-OPERAND>সম্বোধন অভিব্যক্তি দ্বারা গণনা করা হয় । তবে মেমরির অবস্থানের বিষয়বস্তুগুলির পরিবর্তে আমরা লোকেশনটি গন্তব্যে নিয়ে যাই।

LEAনির্দিষ্ট গাণিতিক নির্দেশ নয়; এটি কোনও প্রসেসরের মেমোরি অ্যাড্রেসিং মোডগুলির মধ্য থেকে উত্পন্ন কার্যকর ঠিকানাটিকে বাধা দেওয়ার একটি উপায়।

উদাহরণস্বরূপ, আমরা LEAকেবল একটি সাধারণ সরাসরি ঠিকানা ব্যবহার করতে পারি । কোনও গাণিতিক জড়িত না:

MOV EAX, GLOBALVAR   ; fetch the value of GLOBALVAR into EAX
LEA EAX, GLOBALVAR   ; fetch the address of GLOBALVAR into EAX.

এটি বৈধ; আমরা এটি লিনাক্স প্রম্পটে পরীক্ষা করতে পারি:

$ as
LEA 0, %eax
$ objdump -d a.out

a.out:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <.text>:
   0:   8d 04 25 00 00 00 00    lea    0x0,%eax

এখানে, কোনও আকারযুক্ত মান যোগ করা যায় না, এবং কোনও অফসেট হয় না। জিরো EAX এ সরানো হয়েছে। আমরা তাত্ক্ষণিক অপরেন্ডের সাথে এমওভি ব্যবহার করে তা করতে পারি।

এই কারণেই এমন লোকেরা যারা মনে করেন বন্ধনীগুলি ভিতরে LEA অতিমাত্রায় ব্যবহার করা হয় তারা মারাত্মকভাবে ভুল হয়; বন্ধনী নেইLEA সিনট্যাক্স নয় তবে অ্যাড্রেসিং মোডের অংশ।

এলইএ হার্ডওয়্যার স্তরে আসল। উত্পন্ন নির্দেশটি প্রকৃত ঠিকানা মোডটিকে এনকোড করে এবং প্রসেসর এটিকে ঠিকানার গণনার পয়েন্ট পর্যন্ত বহন করে। তারপরে এটি ঠিকানাটি কোনও মেমরি রেফারেন্স তৈরির পরিবর্তে গন্তব্যে নিয়ে যায়। (যেহেতু অন্য কোনও নির্দেশে ঠিকানা মোডের ঠিকানা গণনার সিপিইউ ফ্ল্যাগগুলির কোনও প্রভাব নেই,LEA কোনও প্রভাব নেই))

ঠিকানা শূন্য থেকে মান লোড করার সাথে বিপরীতে:

$ as
movl 0, %eax
$ objdump -d a.out | grep mov
   0:   8b 04 25 00 00 00 00    mov    0x0,%eax

এটি একটি খুব অনুরূপ এনকোডিং, দেখুন? শুধু এর 8dমধ্যে LEAপরিবর্তিত হয়েছে8b

অবশ্যই, এই LEAএনকোডিংটি তাত্ক্ষণিক শূন্যে সরানোর চেয়ে দীর্ঘ EAX:

$ as
movl $0, %eax
$ objdump -d a.out | grep mov
   0:   b8 00 00 00 00          mov    $0x0,%eax

LEAএই সম্ভাবনাটি বাদ দেওয়ার কোনও কারণ নেই যদিও কেবল একটি সংক্ষিপ্ত বিকল্প রয়েছে; এটি কেবল উপলভ্য মোডের সাথে একটি orthogonal উপায়ে সংযুক্ত।


6

এখানে একটি উদাহরণ।

// compute parity of permutation from lexicographic index
int parity (int p)
{
  assert (p >= 0);
  int r = p, k = 1, d = 2;
  while (p >= k) {
    p /= d;
    d += (k << 2) + 6; // only one lea instruction
    k += 2;
    r ^= p;
  }
  return r & 1;
}

সংকলক বিকল্প হিসাবে -O (অনুকূলিতকরণ) সহ, জিসিসি নির্দেশিত কোড লাইনের জন্য লি নির্দেশিকা সন্ধান করবে।


6

দেখে মনে হচ্ছে যে প্রচুর উত্তর ইতিমধ্যে সম্পূর্ণ, আমি একই রকম এক্সপ্রেশন ফর্ম্যাট থাকাকালীন কীভাবে লি এবং সরানো নির্দেশাবলী আলাদাভাবে কাজ করে তা দেখানোর জন্য আমি আরও একটি উদাহরণ কোড যুক্ত করতে চাই।

একটি দীর্ঘ গল্প সংক্ষিপ্ত করতে, লি নির্দেশিকা এবং মুভি নির্দেশাবলী উভয় নির্দেশকের src অপারেন্ডটি বন্ধনী বন্ধনীর সাথে ব্যবহার করা যেতে পারে। যখন তারা () দিয়ে সংযুক্ত থাকে , তখন () তে প্রকাশটি একইভাবে গণনা করা হয়; যাইহোক, দুটি নির্দেশাবলী src অপারেন্ডে গণনা করা মানটিকে অন্যভাবে ব্যাখ্যা করবে।

অভিব্যক্তিটি লি বা মুভের সাথে ব্যবহার করা হোক না কেন, এসআরসি মানটি নীচের হিসাবে গণনা করা হবে।

ডি (আরবি, রি, এস) => (রেগ [আরবি] + এস * রেজি [রি] + ডি)

যাইহোক, যখন এটি মুভ নির্দেশের সাথে ব্যবহার করা হয়, এটি উপরের অভিব্যক্তি দ্বারা উত্পন্ন ঠিকানা দ্বারা চিহ্নিত মানটি অ্যাক্সেস করার চেষ্টা করে এবং এটি গন্তব্যে সংরক্ষণ করে।

এর বিপরীতে, যখন লি নির্দেশিকাটি উপরের এক্সপ্রেশন দিয়ে কার্যকর করা হয়, তখন এটি উত্পন্ন মানটিকে গন্তব্য হিসাবে লোড করে।

নীচের কোডটি একই পরামিতি সহ লি নির্দেশিকা এবং মুভি নির্দেশকে কার্যকর করে। তবে, পার্থক্যটি ধরতে, আমি মুভের নির্দেশের ফলস্বরূপ কোনও ভুল ঠিকানা অ্যাক্সেস করার কারণে সেগমেন্টেশন ত্রুটিটি ধরতে একটি ব্যবহারকারী-স্তরের সিগন্যাল হ্যান্ডলার যুক্ত করেছি।

উদাহরণ কোড

#define _GNU_SOURCE 1  /* To pick up REG_RIP */
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <signal.h>


uint32_t
register_handler (uint32_t event, void (*handler)(int, siginfo_t*, void*))
{
        uint32_t ret = 0;
        struct sigaction act;

        memset(&act, 0, sizeof(act));
        act.sa_sigaction = handler;
        act.sa_flags = SA_SIGINFO;
        ret = sigaction(event, &act, NULL);
        return ret;
}

void
segfault_handler (int signum, siginfo_t *info, void *priv)
{
        ucontext_t *context = (ucontext_t *)(priv);
        uint64_t rip = (uint64_t)(context->uc_mcontext.gregs[REG_RIP]);
        uint64_t faulty_addr = (uint64_t)(info->si_addr);

        printf("inst at 0x%lx tries to access memory at %ld, but failed\n",
                rip,faulty_addr);
        exit(1);
}

int
main(void)
{
        int result_of_lea = 0;

        register_handler(SIGSEGV, segfault_handler);

        //initialize registers %eax = 1, %ebx = 2

        // the compiler will emit something like
           // mov $1, %eax
           // mov $2, %ebx
        // because of the input operands
        asm("lea 4(%%rbx, %%rax, 8), %%edx \t\n"
            :"=d" (result_of_lea)   // output in EDX
            : "a"(1), "b"(2)        // inputs in EAX and EBX
            : // no clobbers
         );

        //lea 4(rbx, rax, 8),%edx == lea (rbx + 8*rax + 4),%edx == lea(14),%edx
        printf("Result of lea instruction: %d\n", result_of_lea);

        asm volatile ("mov 4(%%rbx, %%rax, 8), %%edx"
                       :
                       : "a"(1), "b"(2)
                       : "edx"  // if it didn't segfault, it would write EDX
          );
}

ফাঁসির ফলাফল

Result of lea instruction: 14
inst at 0x4007b5 tries to access memory at 14, but failed

1
আপনার ইনলাইন asm পৃথক বিবৃতিতে ভাঙ্গা অসুরক্ষিত এবং আপনার ক্লোবার্সের তালিকা অসম্পূর্ণ। বেসিক-এএসএম ব্লকটি বলে যে সংকলকটির কোনও ক্লোবার নেই, তবে এটি বেশ কয়েকটি নিবন্ধকে সংশোধন করে। এছাড়াও, আপনি =dসংকলকটি বলতে ব্যবহার করতে পারেন ফলাফলটি EDX এ রয়েছে, একটি সংরক্ষণ করা mov। আপনি আউটপুটটিতে একটি প্রাথমিক ক্লোবারের ঘোষণাও রেখে গেছেন। এটি আপনি যা প্রদর্শনের চেষ্টা করছেন তা প্রমাণ করে, তবে ইনলাইন asm এর একটি বিভ্রান্তিকর খারাপ উদাহরণ যা অন্য প্রসঙ্গে ব্যবহৃত হলে ভেঙে যাবে। স্ট্যাক ওভারফ্লো উত্তরের জন্য এটি একটি খারাপ জিনিস।
পিটার কর্ডেস

আপনি যদি %%বর্ধিত asm এ সমস্ত নিবন্ধের নাম লিখতে না চান তবে ইনপুট সীমাবদ্ধতাগুলি ব্যবহার করুন। মত asm("lea 4(%%ebx, %%eax, 8), %%edx" : "=d"(result_of_lea) : "a"(1), "b"(2));। সংকলক আরআইজি রেজিস্টার দেওয়ার অর্থ হল আপনার ক্লোবারগুলি ঘোষণা করতে হবে না। আপনি মুভি-তাত্ক্ষণিকভাবে পুরো রেজিস্টারটিকে ওভাররাইট করার আগে আপনি জোর-শূন্যের মাধ্যমে জিনিসগুলিকে অতিরিক্ত জটিল করে তুলছেন।
পিটার কর্ডেস

@ পিটারকর্ডস ধন্যবাদ, পিটার, আপনি কি চান আপনি এই উত্তরটি মুছে ফেলতে বা আপনার মন্তব্যগুলি অনুসরণ করে এটিকে সংশোধন করতে চাই?
যাহিউক লি

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

1
কে কোথায় বলে যে mov 4(%ebx, %eax, 8), %edxএটি অবৈধ? যাইহোক, হ্যাঁ, কারণ আপনার কাছে 64৪-বিট মান রয়েছে এমন সংকলকটি movলিখতে লিখতে হবে তা বোঝা যায় "a"(1ULL)এবং এটি পুরো রেজিস্টারটি পূরণ করার জন্য এটি নিশ্চিত করা দরকার make অনুশীলনে এটি এখনও ব্যবহার করবে mov $1, %eax, কারণ EAX লিখতে শূন্য প্রসারিত হয় RAX- এ, যদি না আপনার চারপাশের কোডের একটি উদ্ভট পরিস্থিতি থাকে যেখানে কম্পাইলার জানত যে RAX = 0xff00000001বা অন্য কিছু। এর জন্য lea, আপনি এখনও 32-বিট অপারেন্ড-আকার ব্যবহার করছেন, সুতরাং ইনপুট রেজিস্টারগুলিতে যে কোনও বিপুল উচ্চ বিট 32-বিটের ফলাফলের উপর কোনও প্রভাব ফেলবে না।
পিটার

4

এলইএ: কেবল একটি "পাটিগণিত" নির্দেশ ..

এমওভি অপারেন্ডগুলির মধ্যে ডেটা স্থানান্তর করে তবে লিটা কেবল গণনা করছে


এলইএ স্পষ্টতই ডেটা সরিয়ে দেয়; এটির গন্তব্য অপারেন্ড রয়েছে। এলইএ সবসময় গণনা করে না; উত্স অপারেন্ডে প্রকাশিত কার্যকর ঠিকানা গণনা করে তা গণনা করে। এলইএ ইএক্স, গ্লোবালভার গণনা করে না; এটি কেবল গ্লোবালবারের ঠিকানাটি ইএক্সে স্থানান্তরিত করে।
কাজ

@ কাজ আপনার মতামতের জন্য ধন্যবাদ আমার উত্সটি ছিল "এলইএ (বোঝার কার্যকর ঠিকানা) মূলত একটি গাণিতিক নির্দেশ — এটি কোনও আসল মেমরি অ্যাক্সেস সম্পাদন করে না, তবে সাধারণত ঠিকানাগুলি গণনার জন্য ব্যবহৃত হয় (যদিও আপনি এটির সাথে সাধারণ উদ্দেশ্য পূর্ণসংখ্যার গণনা করতে পারেন)"। গঠন ইল্দদ-Eilam বই পৃষ্ঠা 149
হিসাবরক্ষক

@ কাজ: এই কারণেই ঠিকানা ইতিমধ্যে লিঙ্ক-টাইম ধ্রুবক হলে এলইএ অপ্রয়োজনীয়; mov eax, offset GLOBALVARপরিবর্তে ব্যবহার করুন। আপনি এলইএ ব্যবহার করতে পারেন তবে এটি কোডের চেয়ে কিছুটা বড় আকারের mov r32, imm32এবং কম বন্দরগুলিতে চালিত হয় কারণ এটি এখনও ঠিকানা-গণনা প্রক্রিয়াতে চলেlea reg, symbolযখন আপনি পিআইসি এবং / অথবা কম 32 বিটের বাইরে ঠিকানা প্রয়োজন তখন কেবল একটি আরআইপি-সম্পর্কিত আত্মীয় এলইএর জন্য 64৪-বিটের ক্ষেত্রে কার্যকর। 32 বা 16-বিট কোডে শূন্য সুবিধা রয়েছে। এলইএ একটি পাটিগণিত নির্দেশ যা সিপিইউর ডিকোড / কম্পিউটিং অ্যাড্রেসিং মোডের ক্ষমতা প্রকাশ করে।
পিটার কর্ডেস

@ কাজ: একই যুক্তি দিয়ে আপনি বলতে পারেন যে imul eax, edx, 1গণনা করা হয় না: এটি কেবল ইডেক্সকে ইমেক্স করে অনুলিপি করে। তবে আসলে এটি 3 টি চক্রের বিলম্বের সাথে গুণকের মাধ্যমে আপনার ডেটা চালায়। অথবা এটি rorx eax, edx, 0কেবল অনুলিপিগুলি (শূন্যের সাথে ঘোরান)।
পিটার কর্ডেস

@ পিটারকর্ডস আমার বক্তব্যটি হ'ল এলইএএএক্স, গ্লোবালওয়াল এবং মোভ ই্যাক্স, গ্লোবালভার দু'জনেই কেবল তাত্ক্ষণিক অপ্রেশন থেকে ঠিকানাটি দখল করেছেন। 1 এর গুণক নেই, বা 0 এর অফসেট প্রয়োগ হচ্ছে; এটি হার্ডওয়্যার পর্যায়ে সেভাবে হতে পারে তবে এটি সমাবেশ ভাষা বা নির্দেশের সেটটিতে দেখা যায় না।
কাজ

1

সমস্ত সাধারণ "গণনা" নির্দেশাবলী যেমন গুণন যোগ করা, একচেটিয়া বা শূন্য, চিহ্ন হিসাবে স্থিতির পতাকা সেট করে set আপনি যদি কোনও জটিল ঠিকানা ব্যবহার করেন, AX xor:= mem[0x333 +BX + 8*CX] তবে জোর ক্রিয়াকলাপ অনুযায়ী পতাকাগুলি সেট করা হবে।

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

এটা স্পষ্ট যে প্রসেসর একবার তার বিষয়বস্তু প্রক্রিয়াজাত করার জন্য জটিল ঠিকানাটি ব্যবহার করতে সক্ষম হয়, এটি অন্যান্য উদ্দেশ্যে এটি গণনা করতে সক্ষম হয়। প্রকৃতপক্ষে এটি x <- 3*x+1একটি নির্দেশে একটি রূপান্তর সম্পাদন করতে ব্যবহৃত হতে পারে । এটি অ্যাসেম্বলি প্রোগ্রামিংয়ের একটি সাধারণ নিয়ম: নির্দেশাবলী ব্যবহার করুন তবে এটি আপনার নৌকাকে দোলায়। নির্দেশের দ্বারা সজ্জিত বিশেষ রূপান্তরটি আপনার পক্ষে কার্যকর কিনা তা কেবলমাত্র গণনা করা।

শেষের সারি

MOV, X| T| AX'| R| BX|

এবং

LEA, AX'| [BX]

এএক্স- তে একই প্রভাব রয়েছে তবে স্থিতির পতাকাগুলিতে নয়। (এটি সিয়াসডিস স্বরলিপি।)


"এটি অ্যাসেম্বলি প্রোগ্রামিংয়ের একটি সাধারণ নিয়ম: নির্দেশাবলী ব্যবহার করুন তবে এটি আপনার নৌকাকে কাঁপায়।" call lbl lbl: pop raxপ্রযুক্তিগতভাবে "কাজ করা" এর মতো মূল্য অর্জনের উপায় হিসাবে আমি ব্যক্তিগতভাবে সেই পরামর্শটি ripদেব না, তবে আপনি শাখার ভবিষ্যদ্বাণীটি অত্যন্ত অসন্তুষ্ট করবেন make আপনি চাইছেন সেই নির্দেশাবলীটি ব্যবহার করুন তবে আপনি কোনও কৌশলপূর্ণ কিছু করলে অবাক হবেন না এবং এর
পরিণতিও

@ The6P4C- এ একটি দরকারী সতর্কতা। তবে শাখার পূর্বাভাসকে অসন্তুষ্ট করার বিকল্প যদি না থাকে তবে তার জন্য আমাদের যেতে হবে। সমাবেশ প্রোগ্রামিংয়ে আরও একটি সাধারণ নিয়ম রয়েছে। কিছু করার বিকল্প উপায় থাকতে পারে এবং আপনাকে অবশ্যই বিকল্পগুলি থেকে বুদ্ধিমানের সাথে বেছে নিতে হবে B নিবন্ধন বিএল এর লিখিত বিষয়বস্তু AL এ রেজিস্টার করার শত শত উপায় রয়েছে। যদি RAX এর অবশিষ্ট অংশ সংরক্ষণের প্রয়োজন না হয় তবে এলইএ একটি বিকল্প হতে পারে। কয়েক হাজার প্রকারের x86 প্রসেসরের কয়েকটিতে পতাকাগুলি প্রভাবিত না করা ভাল ধারণা হতে পারে। গ্রোয়েটজেস অ্যালবার্ট
আলবার্ট ভ্যান ডার হোর্স্ট

-1

যদি ইতিমধ্যে কেউ উল্লেখ করে থাকে তবে আমাকে ক্ষমা করুন, তবে x86 এর দিনগুলিতে যখন মেমরি বিভাজন এখনও প্রাসঙ্গিক ছিল, আপনি এই দুটি নির্দেশাবলীর থেকে একই ফলাফল পেতে পারেন না:

LEA AX, DS:[0x1234]

এবং

LEA AX, CS:[0x1234]

"কার্যকর ঠিকানা" একটি seg:offজুটির "অফসেট" অংশ । এলইএ সেগমেন্ট বেস দ্বারা প্রভাবিত হয় না; এই নির্দেশাবলী উভয়ই (অকার্যকরভাবে) 0x1234এক্স এ দেওয়া হবে। দুর্ভাগ্যক্রমে দুর্ভাগ্যক্রমে কোনও রেজিস্টার বা রেজিস্টার-জুটিতে পূর্ণ রৈখিক ঠিকানা (কার্যকর + বিভাগ অংশ) গণনা করার সহজ উপায় নেই।
পিটার কর্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.