এমওভি এবং এলইএর মধ্যে পার্থক্য কী?


138

আমি এই নির্দেশাবলী মধ্যে পার্থক্য কি জানতে চাই:

MOV AX, [TABLE-ADDR]

এবং

LEA AX, [TABLE-ADDR]


8
ধন্যবাদ নিক প্রথমত, আমি এই লিঙ্কটি দেখে এই প্রশ্নের উত্তর খুঁজে পেতাম না। এখানে আমি একটি সুনির্দিষ্ট তথ্য সন্ধান করছিলাম, আপনার সরবরাহিত লিঙ্কে আলোচনা প্রকৃতির ক্ষেত্রে আরও জেনারেল।
নবীন

3
আমি বহু বছর আগে @ নিকের ডুপকে উত্সাহিত করেছি তবে এখনই ভিটিসি করব। প্রতিচ্ছবিতে, আমি খুব তাড়াহুড়ো করেছিলাম এবং এখন নবীনকে নিয়েছিলাম যে ক) অন্য প্রশ্নের "পার্থক্য কী" এবং জবাব দেয় না) এটি একটি দরকারী প্রশ্ন। আমার ভুলের জন্য নবীর কাছে ক্ষমা - কেবল যদি আমি ভিটিসি পূর্বাবস্থায় ফেরাতে পারতাম ...
রুবেন বারটেলিংক


সম্পর্কিত: ঠিকানা / পয়েন্টার নয় এমন মানগুলিতে এলইএ ব্যবহার করছেন? নির্বিচার গণিতের জন্য এলইএর অন্যান্য ব্যবহার সম্পর্কে কথা বলে।
পিটার

উত্তর:


168
  • LEA মানে বোঝার কার্যকর ঠিকানা ective
  • MOV মানে লোড মান

সংক্ষেপে, LEAআপনি যে আইটেমটি সম্বোধন করছেন তাতে পয়েন্টার লোড করুন যেখানে এমওভি ঠিকানায় ঠিকানার মানটি লোড করে।

এর উদ্দেশ্য LEAহ'ল কাউকে একটি তুচ্ছ-ঠিকানা ঠিকানা গণনা করার অনুমতি দেওয়া এবং ফলাফলটি [পরবর্তী ব্যবহারের জন্য] সংরক্ষণ করা

LEA ax, [BP+SI+5] ; Compute address of value

MOV ax, [BP+SI+5] ; Load value at that address

যেখানে কেবল জড়িতরা জড়িত রয়েছে, MOV(এসেম্বলারের ধ্রুবক গণনার মাধ্যমে) কখনও কখনও ব্যবহারের সহজতম ক্ষেত্রে আচ্ছাদিত হতে পারে LEA। আপনার একাধিক বেস ঠিকানা ইত্যাদি সহ একাধিক অংশ গণনা থাকলে এটি কার্যকর Its


6
সুস্পষ্ট ব্যাখ্যার জন্য +1 ধন্যবাদ, আমাকে অন্য প্রশ্নের উত্তর দিতে সহায়তা করেছে ।
কিংবদন্তি 2 কে

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

2
@ জোসেফগারভিন আইআইআরসি শব্দটি আনা সেই দিকটিতে প্রয়োগ করা হবে; লোড হ'ল আপনি কীভাবে কোনও স্ক্র্যাচ থেকে কোনও রেজিস্টারে মানটি প্রতিস্থাপন করেন। যেমন LAHF: এএইচ রেজিস্টারে ফ্ল্যাগ লোড করুন । সিএলআর-এর সিআইএলে (যা একটি উচ্চ স্তরের স্ট্যাক ভিত্তিক বিমূর্ত মেশিন, লোড শব্দটি কল্পিত স্ট্যাকের উপরে একটি মান স্থাপন বোঝায় এবং সাধারণত l..., এবং s... সমতুল্যটি বিপরীত হয়)। এই নোটগুলি: cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/load.html ) প্রস্তাব দেয় যে প্রকৃতপক্ষে এমন কিছু আর্কিটেকচার রয়েছে যেখানে আপনার পার্থক্য প্রযোজ্য।
রুবেন বারটেলিংক

এটা সব আমাকে মনে করিয়ে দেয় slideshare.net/pirhilton/... );
রুবেন Bartelink

45

এনএএসএম সিনট্যাক্সে:

mov eax, var       == lea eax, [var]   ; i.e. mov r32, imm32
lea eax, [var+16]  == mov eax, var+16
lea eax, [eax*4]   == shl eax, 2        ; but without setting flags

এমএএসএম সিনট্যাক্সে, OFFSET varলোডের পরিবর্তে মুভি -তাত্ক্ষণিক পেতে ব্যবহার করুন ।


3
শুধুমাত্র এনএএসএম সিন্টেক্সে। এমএএসএম সিনট্যাক্সে, mov eax, varএকটি লোড, একইরকম mov eax, [var]এবং আপনাকে mov eax, OFFSET varতাত্ক্ষণিক ধ্রুবক হিসাবে একটি লেবেল ব্যবহার করতে হবে।
পিটার কর্ডেস

1
পরিষ্কার, সরল এবং আমি যা নিশ্চিত করার চেষ্টা করছিলাম তা প্রদর্শন করে। ধন্যবাদ।
জয়আরবি

1
মনে রাখবেন যে এই সমস্ত উদাহরণে, leaআরআইপি-আপেক্ষিক সম্বোধনের জন্য -৪-বিট মোড বাদে আরও খারাপ পছন্দ। mov r32, imm32আরও বন্দর চালায়। lea eax, [edx*4]একটি অনুলিপি এবং শিফ্ট যা অন্য কোনও নির্দেশে করা যায় না অন্যথায়, তবে একই রেজিস্টারে এলইএ কেবল এনকোড করতে আরও বাইট নেয় কারণ [eax*4]একটি প্রয়োজন disp32=0। (এটা, যদিও বদল আনতে চেয়ে ভিন্ন পোর্ট উপর সঞ্চালিত হয়।) দেখুন agner.org/optimize এবং stackoverflow.com/tags/x86/info
পিটার কর্ডেস

29

নির্দেশনা এমওভি রেগ, অ্যাডারের অর্থ ঠিকানা অ্যাড্রেসে জমা রাখা একটি ভেরিয়েবলটি নিবন্ধভুক্তিতে পড়ুন। নির্দেশ এলইএ রেগ, অ্যাডারের অর্থ নিবন্ধের রেজিটিতে ঠিকানা (ঠিকানায় সঞ্চিত পরিবর্তনশীল নয়) পড়ুন।

এমওভির নির্দেশের আরেকটি রূপ হ'ল এমওভি রেগ, ইমিডাটা যার অর্থ তাত্ক্ষণিক ডেটা (যেমন ধ্রুবক) পড়ুন রেজিস্ট্রারে রেজি। নোট করুন যে এলইএ রেগের অ্যাড্রেস, অ্যাডারটি কেবল একটি ধ্রুবক (অর্থাত্ একটি নির্দিষ্ট অফসেট) থাকে তবে এলইএ নির্দেশটি মূলত সমতুল্য এমওভি রেগের মতোই হয়, ইমদ্যাডা নির্দেশ যা তাত্ক্ষণিক তথ্যের মতো একই ধ্রুবককে লোড করে।


11

আপনি যদি কেবল আক্ষরিক উল্লেখ করেন তবে কোনও পার্থক্য নেই। এলইএর আরও দক্ষতা রয়েছে তবে আপনি সেগুলি সম্পর্কে এখানে পড়তে পারেন:

http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-136


আমার ধারণা, ব্যতিক্রম ছাড়া জিএনইউ এসেম্বলারের ক্ষেত্রে যখন এটি বিএস বিভাগে লেবেল আসে তখন এটি সত্য নয়? আপনি leal TextLabel, LabelFromBssSegmentযখন দুর্গন্ধ পেয়েছিলেন তখন আফআর আপনি সত্যিই করতে পারবেন না । যেমন .bss .lcomm LabelFromBssSegment, 4, আপনি করতে হবে movl $TextLabel, LabelFromBssSegment, তাই না?
জেএসমিথ

@JSmyth: যে শুধুমাত্র কারণ leaএকটি রেজিস্টার গন্তব্য প্রয়োজন, কিন্তু movএকটি থাকতে পারে imm32উৎস এবং একটি মেমরি গন্তব্য। এই সীমাবদ্ধতা অবশ্যই জিএনইউ এসেম্বলারের ক্ষেত্রে নির্দিষ্ট নয়।
পিটার কর্ডেস

1
এছাড়াও, এই উত্তরটি মূলত ভুল কারণ প্রশ্নটি জিজ্ঞাসা করছে MOV AX, [TABLE-ADDR]যা কোন বোঝা। সুতরাং একটি বড় পার্থক্য আছে। সমতুল্য নির্দেশটি হ'লmov ax, OFFSET table_addr
পিটার কর্ডেস

10

এটি ব্যবহৃত এসেম্বলারের উপর নির্ভর করে, কারণ

mov ax,table_addr

এমএএসএম হিসাবে কাজ করে

mov ax,word ptr[table_addr]

সুতরাং এটি table_addrঅফসেটটি থেকে প্রথম বাইটগুলি লোড করে না table_addr। পরিবর্তে আপনার ব্যবহার করা উচিত

mov ax,offset table_addr

অথবা

lea ax,table_addr

যা একই কাজ করে।

leatable_addrস্থানীয় ভেরিয়েবল যেমন উদাহরণস্বরূপ সংস্করণটিও সূক্ষ্মভাবে কাজ করে

some_procedure proc

local table_addr[64]:word

lea ax,table_addr

অনেক ধন্যবাদ, তার ঠিক যে আমি আরো উত্তর হিসাবে :( একটির চিহ্নিত করতে পারবেন না
নবীন

5
X86 নির্দেশাবলী এমওভি এবং এলইএর মধ্যে পার্থক্যটি অবশ্যই এসেম্বলারের উপর নির্ভর করে না।
আইজে কেনেডি

4

পূর্ববর্তী উত্তরগুলির কোনওটিই আমার নিজের বিভ্রান্তির নীচে পৌঁছায় না, তাই আমি নিজের নিজের যুক্ত করতে চাই।

আমি যেটা অনুপস্থিত ছিল তা হ'ল leaঅপারেশনগুলি হ'ল বন্ধনীগুলির ব্যবহারের চেয়ে কীভাবে আলাদাmov তার করে।

সি এর কথা চিন্তা করুন আসুন longআমি বলি যে আমি কল করি তার একটি অ্যারে রয়েছে arrayarray[i]ঠিকানায় মেমরি থেকে মান লোড করে এখন এক্সপ্রেশনটি একটি বিন্যাস সম্পাদন করেarray + i * sizeof(long) [1]।

অন্যদিকে, ভাবটি বিবেচনা করুন &array[i]। এটি এখনও সাব-এক্সপ্রেশন ধারণ করে array[i], তবে কোনও ডেরেফারেন্সিং করা হয় না! এর অর্থ array[i]বদলে গেছে। এটি আর কোনও শ্রদ্ধা সম্পাদন করার অর্থ নয় বরং পরিবর্তে এক ধরণের স্পেসিফিকেশন হিসাবে কাজ করে , &আমরা কী মেমরি ঠিকানা খুঁজছি তা জানিয়ে । আপনি যদি চান, আপনি বিকল্পভাবে চিন্তা করতে পারে& হিসাবে বিবেচ্যতা "বাতিল" হিসাবে ।

যেহেতু দুটি ব্যবহারের ক্ষেত্রে বিভিন্নভাবে একই রকম থাকে, তারা সিনট্যাক্স ভাগ করে array[i], তবে &কীভাবে সিনট্যাক্সটিকে ব্যাখ্যা করা হয় তার পরিবর্তনের অস্তিত্ব বা অনুপস্থিতি । ব্যতীত &, এটি একটি বিন্যাস এবং আসলে অ্যারে থেকে পড়ে। সাথে &, এটা না। মূল্যarray + i * sizeof(long) এখনও গণনা করা হয়, তবে এটির নির্ধারণ করা হয় না।

পরিস্থিতি movএবং এর সাথে খুব মিল lea। সাথে mov, একটি ডিরিফারেন্স ঘটে যা এর সাথে ঘটে না lea। এটি উভয় ক্ষেত্রেই প্রথম বন্ধনী ব্যবহার করা সত্ত্বেও। উদাহরণস্বরূপ, movq (%r8), %r9এবং leaq (%r8), %r9। এর সাথে mov, এই প্রথম বন্ধনীর অর্থ "অবজ্ঞা"; সাথে lea, তারা না। এটি নেই যেখানে array[i]কেবল "ডিরিফারেন্স" এর অর্থ কী&

একটি উদাহরণ ক্রমযুক্ত।

কোডটি বিবেচনা করুন

movq (%rdi, %rsi, 8), %rbp

এটি %rdi + %rsi * 8রেজিস্টারটিতে মেমরির অবস্থানের মানটি লোড করে %rbp। হয় যে: রেজিস্টার মান পেতে %rdiএবং রেজিস্টার মান %rsi। পরবর্তীগুলি 8 দ্বারা গুণান এবং তারপরে এটি পূর্বের সাথে যুক্ত করুন। এই অবস্থানটিতে মানটি সন্ধান করুন এবং এটি রেজিস্টারে রাখুন %rbp

এই কোড সি লাইন অনুরূপ x = array[i];, যেখানে arrayহয়ে %rdiএবং iহয়ে %rsiএবং xহয়ে %rbp। দ্য8অ্যারের মধ্যে অন্তর্ভুক্ত ডাটা টাইপ দৈর্ঘ্য হয়।

এখন একই জাতীয় কোড যা ব্যবহার করে তা বিবেচনা করুন lea:

leaq (%rdi, %rsi, 8), %rbp

শুধু ব্যবহার হিসাবে movqdereferencing অনুরূপ, ব্যবহার leaqএখানে অনুরূপ না dereferencing। সমাবেশের এই লাইনটি সি লাইনের সাথে মিলে যায় x = &array[i];। স্মরণ করুন যে ডিফারেন্সিং থেকে শুরু করে কোনও অবস্থানকে সুনির্দিষ্ট করে &তোলার অর্থ পরিবর্তন করে array[i]। তেমনিভাবে, ব্যবহারকে ডিফেরেন্সিং থেকে শুরু করে কোনও অবস্থান নির্দিষ্ট leaqকরার অর্থ পরিবর্তিত হয় (%rdi, %rsi, 8)

কোডটির এই লাইনটির শব্দার্থবিজ্ঞান নীচে রয়েছে: রেজিস্টারে %rdiমান এবং রেজিস্টারে মান পান %rsi। পরবর্তীগুলি 8 দ্বারা গুণান এবং তারপরে এটি পূর্বের সাথে যুক্ত করুন। এই মানটি রেজিস্টারে রাখুন %rbp। মেমরি থেকে কোনও বোঝা জড়িত নয়, কেবল গাণিতিক ক্রিয়াকলাপ [2]।

মনে রাখবেন যে আমার বর্ণনার leaqএবং এর মধ্যে একমাত্র পার্থক্য movqহ'ল এটি movqএকটি শ্রদ্ধাবোধ করে, এবং leaqনা। প্রকৃতপক্ষে, leaqবর্ণনাটি লিখতে , আমি মূলত অনুলিপিটি + পোস্ট করে দিয়েছিলাম movqএবং তারপরে "এই স্থানে মানটি সন্ধান করি" removed

সংক্ষেপ করার জন্য: movqবনাম leaqচতুর কারণ তারা প্রথম বন্ধনী ব্যবহার আচরণ হিসাবে, (%rsi)এবং (%rdi, %rsi, 8), ভিন্নভাবে। ইন movq(এবং ব্যতীত অন্য সব নির্দেশ lea), এই প্রথম বন্ধনী একটি জেনুইন ডি-রেফারেন্স বোঝাতে মধ্যে যেহেতু leaqতারা না এবং বিশুদ্ধরূপে সুবিধাজনক সিনট্যাক্স হয়।


[1] আমি বলেছি যে যখন arrayকোনও অ্যারে হয় longতখন অভিব্যক্তি array[i]ঠিকানা থেকে মান বোঝায় array + i * sizeof(long)। এটি সত্য, তবে একটি সূক্ষ্মতা রয়েছে যা মোকাবিলা করা উচিত। আমি যদি সি কোড লিখি

long x = array[5];

এটি টাইপিংয়ের মতো নয়

long x = *(array + 5 * sizeof(long));

দেখে মনে হচ্ছে এটি আমার আগের বক্তব্যগুলির ভিত্তিতে হওয়া উচিত , তবে তা নয় not

যা চলছে তা সি পয়েন্টার সংযোজনটির একটি কৌশল আছে। বলুন আমার কাছে pটাইপের মানগুলির দিকে নির্দেশকারী একটি পয়েন্টার রয়েছে T। অভিব্যক্তি p + iকরে না মানে "এ অবস্থান pপ্লাস iবাইট"। পরিবর্তে, অভিব্যক্তিটির অর্থ p + i আসলে " pপ্লাস i * sizeof(T)বাইটে অবস্থান "।

এর সুবিধাটি হ'ল "পরবর্তী মান" পেতে কেবল আমাদের p + 1পরিবর্তে লিখতে হবে p + 1 * sizeof(T)

এর অর্থ সি কোডটি long x = array[5];আসলে সমান

long x = *(array + 5)

কারণ সি স্বয়ংক্রিয়ভাবে এর 5দ্বারা গুণিত করবে sizeof(long)

সুতরাং এই স্ট্যাকওভারফ্লো প্রশ্নটির প্রসঙ্গে, এটি কীভাবে প্রাসঙ্গিক? এর অর্থ হ'ল আমি যখন "ঠিকানা array + i * sizeof(long)" বলি, তখন আমি " " এর অর্থ সি অভিব্যক্তি হিসাবে ব্যাখ্যা করি নাarray + i * sizeof(long)sizeof(long)আমার উত্তরটি আরও সুস্পষ্ট করার জন্য আমি নিজে থেকে গুণটি করছি, তবে বুঝতে পারি যে এর কারণে এই অভিব্যক্তিটি সি হিসাবে পড়তে হবে না ঠিক যেমন সি সিট্যাক্স ব্যবহার করে এমন সাধারণ গণিত।

[২] পার্শ্ব দ্রষ্টব্য: যেহেতু leaসমস্তগুলি পাটিগণিতের ক্রিয়াকলাপ, তাই তার যুক্তিগুলিকে আসলে বৈধ ঠিকানাগুলি উল্লেখ করতে হবে না। এই কারণে, এটি প্রায়শই মানগুলিতে বিশুদ্ধ গাণিতিক সম্পাদন করতে ব্যবহৃত হয় যা অবধারিত হওয়ার উদ্দেশ্যে নয়। উদাহরণস্বরূপ, অনুকূলিতকরণ অনুবাদ ccসঙ্গে-O2

long f(long x) {
  return x * 5;
}

নিম্নলিখিতগুলিতে (অপ্রাসঙ্গিক লাইনগুলি সরানো):

f:
  leaq (%rdi, %rdi, 4), %rax  # set %rax to %rdi + %rdi * 4
  ret

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

"মান পাবেন %rdi" - এটি আশ্চর্যের সাথে বলা হয়। আপনি বোঝাতে চাইছেন যে নিবন্ধকের মানটি rdiব্যবহার করা উচিত। আপনার "এট" ব্যবহারের অর্থ মনে হচ্ছে এমন কোনও স্মৃতিচারণ যা সেখানে কিছুই নেই।
বাস্তু

@ পিটারকর্ডস ধন্যবাদ! আমি উত্তরে এটি একটি বিশেষ ক্ষেত্রে হওয়ার বিষয়টি যুক্ত করেছি।
কোয়েলক্লেফ

1
@ecm ভাল পয়েন্ট; আমি তা খেয়াল করিনি। আমি এখন এটি পরিবর্তন করেছি, আপনাকে ধন্যবাদ! :)
কোয়েলক্লেফ

অবগতির জন্য, খাটো বাচনভঙ্গীর উপরে নির্ভর করে সংশোধন করা হয়েছে সমস্যা ECM নির্দিষ্ট রয়েছে: "মান এর %rdi বা" মান " মধ্যে %rdi "। আপনার "রেজিস্টারে মান %rdi" দীর্ঘ তবে জরিমানা, এবং সম্ভবত রেজিস্টার বনাম মেমরি বুঝতে লড়াইয়ে যাওয়া কাউকে সহায়তা করতে পারে।
পিটার কর্ডেস

2

মূলত ... "আরগিতে যান ... এটি গণনার পরে ..." এটি অন্য উদ্দেশ্যেও দুর্দান্ত বলে মনে হচ্ছে :)

যদি আপনি কেবল ভুলে যান যে মানটি একটি পয়েন্টার তবে আপনি এটি কোড অপটিমাইজেশন / মিনিমাইজেশনের জন্য ব্যবহার করতে পারেন ... যা কখনও ..

MOV EBX , 1
MOV ECX , 2

;//with 1 instruction you got result of 2 registers in 3rd one ...
LEA EAX , [EBX+ECX+5]

EAX = 8

মৌলিক এটি হবে:

MOV EAX, EBX
ADD EAX, ECX
ADD EAX, 5

হ্যাঁ, leaএকটি শিফট এবং অ্যাড নির্দেশিকা যা মেমোরি-অপরেন্ড মেশিন এনকোডিং এবং সিনট্যাক্স ব্যবহার করে, কারণ হার্ডওয়্যারটি ইতিমধ্যে জানে যে কিভাবে ModR / M + SIB + disp0 / 8/32 ডিকোড করতে হয়।
পিটার কর্ডেস

1

অন্যান্য উত্তরে যেমন বলা হয়েছে:

  • MOVবন্ধনীগুলির ঠিকানায় থাকা ডেটাটি ধরে ফেলবে এবং সেই ডেটাটি গন্তব্য অপারেণ্ডে রাখবে।
  • LEAবন্ধনীগুলির ভিতরে ঠিকানার গণনা সম্পাদন করবে এবং সেই গণনা করা ঠিকানাটি গন্তব্য অপারেণ্ডে রাখবে। এটি আসলে স্মৃতিতে না গিয়ে এবং ডেটা না পেয়েই ঘটে। কাজটি করা হয়েছে LEA"কার্যকর ঠিকানা" গণনার মধ্যে।

যেহেতু স্মৃতিটিকে বিভিন্নভাবে সম্বোধন করা যেতে পারে (নীচের উদাহরণগুলি দেখুন), LEAকখনও কখনও স্পষ্ট ADDবা MULনির্দেশ (বা সমমান) ব্যবহার না করে একসাথে নিবন্ধগুলি যোগ বা গুণ করতে ব্যবহৃত হয় ।

যেহেতু প্রত্যেকে ইন্টেল সিনট্যাক্সে উদাহরণ দেখাচ্ছে, তাই এখানে এটিএন্ডটি সিনট্যাক্সের কয়েকটি রয়েছে:

MOVL 16(%ebp), %eax       /* put long  at  ebp+16  into eax */
LEAL 16(%ebp), %eax       /* add 16 to ebp and store in eax */

MOVQ (%rdx,%rcx,8), %rax  /* put qword at  rcx*8 + rdx  into rax */
LEAQ (%rdx,%rcx,8), %rax  /* put value of "rcx*8 + rdx" into rax */

MOVW 5(%bp,%si), %ax      /* put word  at  si + bp + 5  into ax */
LEAW 5(%bp,%si), %ax      /* put value of "si + bp + 5" into ax */

MOVQ 16(%rip), %rax       /* put qword at rip + 16 into rax                 */
LEAQ 16(%rip), %rax       /* add 16 to instruction pointer and store in rax */

MOVL label(,1), %eax      /* put long at label into eax            */
LEAL label(,1), %eax      /* put the address of the label into eax */

আপনি কখনই lea label, %eaxনিরঙ্কুশ [disp32]ঠিকানা ঠিকানা চাইবেন না । mov $label, %eaxপরিবর্তে ব্যবহার করুন। হ্যাঁ এটি কাজ করে, তবে এটি কম দক্ষ (বৃহত মেশিন কোড এবং কম এক্সিকিউশন ইউনিটে চালিত হয়)। আপনি যেহেতু এটিএন্ডটিটি উল্লেখ করেছেন, ঠিকানা / পয়েন্টার নয় এমন মানগুলিতে এলইএ ব্যবহার করছেন? এটি অ্যান্ড টি ব্যবহার করে, এবং আমার উত্তরের অন্যান্য কিছু এটিএন্ডটি উদাহরণ রয়েছে।
পিটার

1

এটি একটি উদাহরণ দিয়ে বুঝতে দিন।

মোভ ইক্স, [ইবিএক্স] এবং

Lea eax, [ebx] ধরুন ebx এর মান 0x400000। তারপরে মুভ 0x400000 ঠিকানায় যাবে এবং 4 বাইট উপাত্তের অনুলিপিটি তাদের ইক্স রেজিস্ট্রারে উপস্থাপন করবে here সুতরাং, প্রতিটি ক্ষেত্রে এক্সের প্রতিটি নির্দেশের মান কার্যকর হওয়ার পরে (মেমরি 0x400000 ধারণ করে 30) ধরে নেওয়া হবে।

eax = 30 (মুভের ক্ষেত্রে) eax = 0x400000 (Lea এর ক্ষেত্রে) সংজ্ঞা জন্য মুভিটি rm32 থেকে গন্তব্যে (মুভ ডেস্ট rm32) অনুলিপি করুন এবং লি (কার্যকর কার্যকর ঠিকানা) ঠিকানায় গন্তব্যে অনুলিপি করবেন (মুভ ডেস্ট আরএম 32) )।


0

এলইএ (লোডের কার্যকর ঠিকানা) একটি শিফট এবং অ্যাড নির্দেশিকা। এটি 8086 এ যুক্ত করা হয়েছিল কারণ অ্যাড্রেসিং মোডগুলি ডিকোড করতে এবং গণনা করার জন্য হার্ডওয়্যার রয়েছে।


0

এমওভি এলইএ [লেবেল] এর মতো একই কাজ করতে পারে তবে মোভের নির্দেশাবলীতে একটি তাত্ক্ষণিক ধ্রুবক হিসাবে (নির্দেশকের দ্বারা আগাম গণনা করা হয়) নির্দেশের ভিতরে কার্যকর ঠিকানা থাকে। এলইএ নির্দেশনা কার্যকর করার সময় কার্যকর ঠিকানা গণনা করতে পিসি-আপেক্ষিক ব্যবহার করে।


এটি কেবলমাত্র 64৪-বিট মোডের ক্ষেত্রেই সত্য (যেখানে পিসি-আপেক্ষিক ঠিকানা নতুন ছিল); অন্যান্য মোডে lea [labelবাইটস বনাম আরও কমপ্যাক্টের অর্থহীন বর্জ্য mov, সুতরাং আপনি যে অবস্থার বিষয়ে কথা বলছেন তা উল্লেখ করা উচিত। এছাড়াও, কিছু [label]সংশ্লেষকারীদের জন্য কোনও আরআইপি-আপেক্ষিক ঠিকানা মোডের জন্য সঠিক বাক্য গঠন নয়। তবে হ্যাঁ, এটি সঠিক। জিএনইউ অ্যাসেমব্লার নিবন্ধনে ফাংশন বা লেবেলের ঠিকানা কীভাবে লোড করবেন সে সম্পর্কে আরও বিশদ ব্যাখ্যা করে।
পিটার কর্ডেস

-1

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

কার্যকরভাবে এলইএ ব্যবহার করা সি এর মতো ভাষায় পয়েন্টার ব্যবহারের সমতুল্য, যেমন এটি একটি শক্তিশালী নির্দেশ।


7
আমি মনে করি এই উত্তরটি সবচেয়ে বিভ্রান্তিকর। "এলইএর নির্দেশনাটি 'লোড ইফেক্টিভ অ্যাড্রেস' যা একটি নির্দেশিত নির্দেশ, যার অর্থ টেবিল-এডিডিআর কোনও মেমরির দিকে নির্দেশ করে যেখানে লোড করার ঠিকানাটি পাওয়া যায়।" আসলে এলইএ ঠিকানা লোড করবে, ঠিকানার বিষয়বস্তু নয়। আমি মনে করি আসলে প্রশ্নকর্তাকে আশ্বাস দেওয়া দরকার যে এমওভি এবং এলইএ ওভারল্যাপ করতে পারে এবং ঠিক একই কাজটি করতে পারে, কিছু পরিস্থিতিতে
বিল ফোর্স্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.