আমি এই নির্দেশাবলী মধ্যে পার্থক্য কি জানতে চাই:
MOV AX, [TABLE-ADDR]
এবং
LEA AX, [TABLE-ADDR]
আমি এই নির্দেশাবলী মধ্যে পার্থক্য কি জানতে চাই:
MOV AX, [TABLE-ADDR]
এবং
LEA AX, [TABLE-ADDR]
উত্তর:
LEA
মানে বোঝার কার্যকর ঠিকানা ectiveMOV
মানে লোড মানসংক্ষেপে, LEA
আপনি যে আইটেমটি সম্বোধন করছেন তাতে পয়েন্টার লোড করুন যেখানে এমওভি ঠিকানায় ঠিকানার মানটি লোড করে।
এর উদ্দেশ্য LEA
হ'ল কাউকে একটি তুচ্ছ-ঠিকানা ঠিকানা গণনা করার অনুমতি দেওয়া এবং ফলাফলটি [পরবর্তী ব্যবহারের জন্য] সংরক্ষণ করা
LEA ax, [BP+SI+5] ; Compute address of value
MOV ax, [BP+SI+5] ; Load value at that address
যেখানে কেবল জড়িতরা জড়িত রয়েছে, MOV
(এসেম্বলারের ধ্রুবক গণনার মাধ্যমে) কখনও কখনও ব্যবহারের সহজতম ক্ষেত্রে আচ্ছাদিত হতে পারে LEA
। আপনার একাধিক বেস ঠিকানা ইত্যাদি সহ একাধিক অংশ গণনা থাকলে এটি কার্যকর Its
LAHF
: এএইচ রেজিস্টারে ফ্ল্যাগ লোড করুন । সিএলআর-এর সিআইএলে (যা একটি উচ্চ স্তরের স্ট্যাক ভিত্তিক বিমূর্ত মেশিন, লোড শব্দটি কল্পিত স্ট্যাকের উপরে একটি মান স্থাপন বোঝায় এবং সাধারণত l
..., এবং s
... সমতুল্যটি বিপরীত হয়)। এই নোটগুলি: cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/load.html ) প্রস্তাব দেয় যে প্রকৃতপক্ষে এমন কিছু আর্কিটেকচার রয়েছে যেখানে আপনার পার্থক্য প্রযোজ্য।
এনএএসএম সিনট্যাক্সে:
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
লোডের পরিবর্তে মুভি -তাত্ক্ষণিক পেতে ব্যবহার করুন ।
mov eax, var
একটি লোড, একইরকম mov eax, [var]
এবং আপনাকে mov eax, OFFSET var
তাত্ক্ষণিক ধ্রুবক হিসাবে একটি লেবেল ব্যবহার করতে হবে।
lea
আরআইপি-আপেক্ষিক সম্বোধনের জন্য -৪-বিট মোড বাদে আরও খারাপ পছন্দ। mov r32, imm32
আরও বন্দর চালায়। lea eax, [edx*4]
একটি অনুলিপি এবং শিফ্ট যা অন্য কোনও নির্দেশে করা যায় না অন্যথায়, তবে একই রেজিস্টারে এলইএ কেবল এনকোড করতে আরও বাইট নেয় কারণ [eax*4]
একটি প্রয়োজন disp32=0
। (এটা, যদিও বদল আনতে চেয়ে ভিন্ন পোর্ট উপর সঞ্চালিত হয়।) দেখুন agner.org/optimize এবং stackoverflow.com/tags/x86/info ।
নির্দেশনা এমওভি রেগ, অ্যাডারের অর্থ ঠিকানা অ্যাড্রেসে জমা রাখা একটি ভেরিয়েবলটি নিবন্ধভুক্তিতে পড়ুন। নির্দেশ এলইএ রেগ, অ্যাডারের অর্থ নিবন্ধের রেজিটিতে ঠিকানা (ঠিকানায় সঞ্চিত পরিবর্তনশীল নয়) পড়ুন।
এমওভির নির্দেশের আরেকটি রূপ হ'ল এমওভি রেগ, ইমিডাটা যার অর্থ তাত্ক্ষণিক ডেটা (যেমন ধ্রুবক) পড়ুন রেজিস্ট্রারে রেজি। নোট করুন যে এলইএ রেগের অ্যাড্রেস, অ্যাডারটি কেবল একটি ধ্রুবক (অর্থাত্ একটি নির্দিষ্ট অফসেট) থাকে তবে এলইএ নির্দেশটি মূলত সমতুল্য এমওভি রেগের মতোই হয়, ইমদ্যাডা নির্দেশ যা তাত্ক্ষণিক তথ্যের মতো একই ধ্রুবককে লোড করে।
আপনি যদি কেবল আক্ষরিক উল্লেখ করেন তবে কোনও পার্থক্য নেই। এলইএর আরও দক্ষতা রয়েছে তবে আপনি সেগুলি সম্পর্কে এখানে পড়তে পারেন:
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
, তাই না?
lea
একটি রেজিস্টার গন্তব্য প্রয়োজন, কিন্তু mov
একটি থাকতে পারে imm32
উৎস এবং একটি মেমরি গন্তব্য। এই সীমাবদ্ধতা অবশ্যই জিএনইউ এসেম্বলারের ক্ষেত্রে নির্দিষ্ট নয়।
MOV AX, [TABLE-ADDR]
যা কোন বোঝা। সুতরাং একটি বড় পার্থক্য আছে। সমতুল্য নির্দেশটি হ'লmov ax, OFFSET table_addr
এটি ব্যবহৃত এসেম্বলারের উপর নির্ভর করে, কারণ
mov ax,table_addr
এমএএসএম হিসাবে কাজ করে
mov ax,word ptr[table_addr]
সুতরাং এটি table_addr
অফসেটটি থেকে প্রথম বাইটগুলি লোড করে না table_addr
। পরিবর্তে আপনার ব্যবহার করা উচিত
mov ax,offset table_addr
অথবা
lea ax,table_addr
যা একই কাজ করে।
lea
table_addr
স্থানীয় ভেরিয়েবল যেমন উদাহরণস্বরূপ সংস্করণটিও সূক্ষ্মভাবে কাজ করে
some_procedure proc
local table_addr[64]:word
lea ax,table_addr
পূর্ববর্তী উত্তরগুলির কোনওটিই আমার নিজের বিভ্রান্তির নীচে পৌঁছায় না, তাই আমি নিজের নিজের যুক্ত করতে চাই।
আমি যেটা অনুপস্থিত ছিল তা হ'ল lea
অপারেশনগুলি হ'ল বন্ধনীগুলির ব্যবহারের চেয়ে কীভাবে আলাদাmov
তার করে।
সি এর কথা চিন্তা করুন আসুন long
আমি বলি যে আমি কল করি তার একটি অ্যারে রয়েছে array
। array[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
শুধু ব্যবহার হিসাবে movq
dereferencing অনুরূপ, ব্যবহার 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
&
অপারেটর একটি ভাল উপমা। সম্ভবত এটি উল্লেখ করা মূল্যবান যে এলইএ হ'ল একটি বিশেষ বিষয়, যখন এমওভি হ'ল অন্য প্রতিটি নির্দেশের মতো যা একটি স্মৃতি নিতে বা রেজিস্ট্রেশন করতে পারে। উদাহরণস্বরূপ add (%rdi), %eax
, এমওভির মতো মেমরিকে সম্বোধন করতে ঠিকানার মোড ব্যবহার করে। এটি আরও সম্পর্কিত: ঠিকানাগুলি / পয়েন্টার নয় এমন মানগুলিতে এলইএ ব্যবহার করছেন? এই ব্যাখ্যাটি আরও গ্রহণ করে: এলইএ হ'ল আপনি কীভাবে সিপিইউর এইচডাব্লু সমর্থনটি স্বেচ্ছাসেবী গণনা করতে অ্যাড্রেস ম্যাথের জন্য ব্যবহার করতে পারেন।
%rdi
" - এটি আশ্চর্যের সাথে বলা হয়। আপনি বোঝাতে চাইছেন যে নিবন্ধকের মানটি rdi
ব্যবহার করা উচিত। আপনার "এট" ব্যবহারের অর্থ মনে হচ্ছে এমন কোনও স্মৃতিচারণ যা সেখানে কিছুই নেই।
%rdi
বা" মান " মধ্যে %rdi
"। আপনার "রেজিস্টারে মান %rdi
" দীর্ঘ তবে জরিমানা, এবং সম্ভবত রেজিস্টার বনাম মেমরি বুঝতে লড়াইয়ে যাওয়া কাউকে সহায়তা করতে পারে।
মূলত ... "আরগিতে যান ... এটি গণনার পরে ..." এটি অন্য উদ্দেশ্যেও দুর্দান্ত বলে মনে হচ্ছে :)
যদি আপনি কেবল ভুলে যান যে মানটি একটি পয়েন্টার তবে আপনি এটি কোড অপটিমাইজেশন / মিনিমাইজেশনের জন্য ব্যবহার করতে পারেন ... যা কখনও ..
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 ডিকোড করতে হয়।
অন্যান্য উত্তরে যেমন বলা হয়েছে:
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
পরিবর্তে ব্যবহার করুন। হ্যাঁ এটি কাজ করে, তবে এটি কম দক্ষ (বৃহত মেশিন কোড এবং কম এক্সিকিউশন ইউনিটে চালিত হয়)। আপনি যেহেতু এটিএন্ডটিটি উল্লেখ করেছেন, ঠিকানা / পয়েন্টার নয় এমন মানগুলিতে এলইএ ব্যবহার করছেন? এটি অ্যান্ড টি ব্যবহার করে, এবং আমার উত্তরের অন্যান্য কিছু এটিএন্ডটি উদাহরণ রয়েছে।
এটি একটি উদাহরণ দিয়ে বুঝতে দিন।
মোভ ইক্স, [ইবিএক্স] এবং
Lea eax, [ebx] ধরুন ebx এর মান 0x400000। তারপরে মুভ 0x400000 ঠিকানায় যাবে এবং 4 বাইট উপাত্তের অনুলিপিটি তাদের ইক্স রেজিস্ট্রারে উপস্থাপন করবে here সুতরাং, প্রতিটি ক্ষেত্রে এক্সের প্রতিটি নির্দেশের মান কার্যকর হওয়ার পরে (মেমরি 0x400000 ধারণ করে 30) ধরে নেওয়া হবে।
eax = 30 (মুভের ক্ষেত্রে) eax = 0x400000 (Lea এর ক্ষেত্রে) সংজ্ঞা জন্য মুভিটি rm32 থেকে গন্তব্যে (মুভ ডেস্ট rm32) অনুলিপি করুন এবং লি (কার্যকর কার্যকর ঠিকানা) ঠিকানায় গন্তব্যে অনুলিপি করবেন (মুভ ডেস্ট আরএম 32) )।
এমওভি এলইএ [লেবেল] এর মতো একই কাজ করতে পারে তবে মোভের নির্দেশাবলীতে একটি তাত্ক্ষণিক ধ্রুবক হিসাবে (নির্দেশকের দ্বারা আগাম গণনা করা হয়) নির্দেশের ভিতরে কার্যকর ঠিকানা থাকে। এলইএ নির্দেশনা কার্যকর করার সময় কার্যকর ঠিকানা গণনা করতে পিসি-আপেক্ষিক ব্যবহার করে।
lea [label
বাইটস বনাম আরও কমপ্যাক্টের অর্থহীন বর্জ্য mov
, সুতরাং আপনি যে অবস্থার বিষয়ে কথা বলছেন তা উল্লেখ করা উচিত। এছাড়াও, কিছু [label]
সংশ্লেষকারীদের জন্য কোনও আরআইপি-আপেক্ষিক ঠিকানা মোডের জন্য সঠিক বাক্য গঠন নয়। তবে হ্যাঁ, এটি সঠিক। জিএনইউ অ্যাসেমব্লার নিবন্ধনে ফাংশন বা লেবেলের ঠিকানা কীভাবে লোড করবেন সে সম্পর্কে আরও বিশদ ব্যাখ্যা করে।
পার্থক্যটি সূক্ষ্ম তবে গুরুত্বপূর্ণ। টেবিল-এডিডিআর লেবেলটির মূল ঠিকানাটির একটি অনুলিপি মোভ নির্দেশিকা হ'ল কার্যকরভাবে। এলইএ নির্দেশনাটি একটি 'লোড ইফেক্টিভ অ্যাড্রেস' যা একটি নির্দেশিত নির্দেশ, যার অর্থ টেবিল-এডিডিআর কোনও মেমরির দিকে নির্দেশ করে যেখানে লোড করার ঠিকানাটি পাওয়া যায়।
কার্যকরভাবে এলইএ ব্যবহার করা সি এর মতো ভাষায় পয়েন্টার ব্যবহারের সমতুল্য, যেমন এটি একটি শক্তিশালী নির্দেশ।