AL / AX / EAX, এবং অন্যান্য সংক্ষিপ্ত ফর্ম এবং একক-বাইট নির্দেশাবলীর জন্য বিশেষ ক্ষেত্রে শর্ট-ফর্ম এনকোডিংগুলি ব্যবহার করুন
উদাহরণগুলি 32/64-বিট মোড ধরে নেয়, যেখানে ডিফল্ট অপারেন্ডের আকার 32 বিট হয়। অপারেন্ড-আকারের উপসর্গটি নির্দেশটিকে EAX (বা 16 বিট মোডে বিপরীত) এর পরিবর্তে AX এ পরিবর্তন করে।
inc/dec
একটি রেজিস্টার (8-বিট ব্যতীত): inc eax
/ dec ebp
। (X86-64 নয়: 0x4x
অপকোড বাইটগুলি আরএক্স প্রিফিক্স হিসাবে পুনঃপ্রেরণ করা হয়েছিল, তাই inc r/m32
কেবলমাত্র এনকোডিং))
8-বিটটি inc bl
2 বাইট, inc r/m8
অপকোড + মোডিআর / এম অপারেন্ড এনকোডিং ব্যবহার করে । সুতরাং বাড়ানোর জন্য ব্যবহার inc ebx
করুন bl
, যদি এটি নিরাপদ থাকে। (যেমন উপরের বাইটগুলি শূন্য নয় এমন ক্ষেত্রে আপনার যদি জেডএফ ফলাফলের প্রয়োজন হয় না)।
scasd
: e/rdi+=4
, নিবন্ধটি পঠনযোগ্য স্মৃতিতে নির্দেশ করে। আপনি FLAGS ফলাফল (যেমন cmp eax,[rdi]
/ rdi+=4
) সম্পর্কে চিন্তা না করে এমনকি কখনও কখনও দরকারী । এবং 64-বিট মোডে, scasb
1-বাইট হিসাবে কাজ করতে পারেinc rdi
, যদি লডসবি বা স্টসব কার্যকর না হয়।
xchg eax, r32
: এই হল সেই জায়গা যেখানে 0x90 NOP থেকে এসেছেন: xchg eax,eax
। উদাহরণ: দুই 3 রেজিস্টার পুনরায় ব্যবস্থা xchg
একটি নির্দেশাবলী cdq
/ idiv
লুপ 8 বাইটে GCD জন্য যেখানে নির্দেশাবলীর সবচেয়ে একক বাইট হয়, একটি অপব্যবহার সহ inc ecx
/ loop
পরিবর্তে test ecx,ecx
/jnz
cdq
: সাইন-এক্সটেনড EAX কে EDX: EAX, অর্থাৎ EAX এর উচ্চ বিট EDX এর সমস্ত বিটে অনুলিপি করা। জ্ঞাত নন-নেগেটিভ সহ একটি শূন্য তৈরি করতে, বা যোগ করতে / সাব বা মাস্ক সহ 0 / -1 পেতে। x86 ইতিহাস পাঠ: cltq
বনামmovslq
, এবং এটি এবং সম্পর্কিত বনাম এর জন্য এবং সম্পর্কিত সম্পর্কিত বুনিয়াদী স্মৃতিবিজ্ঞান cdqe
।
লডসবি / ডি : ক্লোবার্বিং পতাকাগুলি পছন্দ করে mov eax, [rsi]
/ rsi += 4
ছাড়াই। (ধরে নিচ্ছি যে ডিএফ স্পষ্ট, কোন স্ট্যান্ডার্ড কলিং কনভেনশনগুলির ফাংশন এন্ট্রিতে প্রয়োজন)) এছাড়াও স্টসবি / ডি, কখনও কখনও স্কাস এবং খুব কমই চলন্ত / সিএমপিএস থাকে।
push
/ pop reg
। যেমন 64৪-বিট মোডে push rsp
/ / pop rdi
২ বাইট, তবে mov rdi, rsp
একটি রেক্স প্রিফিক্স প্রয়োজন এবং এটি 3 বাইট।
xlatb
বিদ্যমান, তবে খুব কমই দরকারী। একটি বৃহত সন্ধানের টেবিল এড়ানোর জন্য কিছু। আমি এএএ / ডিএএ বা অন্যান্য প্যাকড-বিসিডি বা 2-এএসসিআইআই-ডিজিটের নির্দেশাবলীর জন্য কখনও ব্যবহার খুঁজে পাইনি।
1-বাইট lahf
/ sahf
খুব কমই দরকারী। আপনি / এর বিকল্প হিসাবে করতে পারেন , তবে এটি সাধারণত কার্যকর নয়।lahf
and ah, 1
setc ah
এবং সিএফের জন্য বিশেষত, sbb eax,eax
0 / -1, এমনকি আন-ডকুমেন্টেড তবে সর্বজনীনভাবে সমর্থিত 1-বাইট salc
(ক্যারি থেকে AL সেট করুন) পাওয়া যায় যা sbb al,al
পতাকাগুলি প্রভাবিত না করে কার্যকরভাবে করে । (X86-64 এ সরানো হয়েছে)। আমি SALC ব্যবহৃত ডেনিস ♦: ব্যবহারকারী কৃতজ্ঞতা চ্যালেঞ্জ # 1 ।
1-বাইট cmc
/ clc
/ stc
(ফ্লিপ ("পরিপূরক")), পরিষ্কার বা সেট সিএফ) খুব কমই দরকারী, যদিও আমি বেস 10 ^ 9 খণ্ডগুলির সাথে বর্ধিত-নির্ভুলতা সংযোজনের জন্য একটি ব্যবহারcmc
খুঁজে পেয়েছি । শর্তহীন নির্ধারণ / সিএফ সাফ করার জন্য সাধারণত এটি অন্য নির্দেশের অংশ হিসাবে হওয়ার জন্য ব্যবস্থা করুন, যেমন xor eax,eax
সিএফ পাশাপাশি ইএএক্স সাফ করে। অন্যান্য শর্তের পতাকাগুলির জন্য সমান নির্দেশনা নেই, কেবল ডিএফ (স্ট্রিং দিকনির্দেশ) এবং আইএফ (বাধা)। বহনকারী পতাকাটি অনেকগুলি নির্দেশের জন্য বিশেষ; শিফট এটি সেট করে, adc al, 0
এটি 2 বাইটে AL এ যুক্ত করতে পারে এবং আমি পূর্বে অননুমোদিত এসএলসি উল্লেখ করেছি।
std
/ cld
খুব কমই এটি মূল্যবান বলে মনে হচ্ছে । বিশেষত ৩২-বিট কোডে, কেবলমাত্র dec
একটি পয়েন্টার এবং একটি mov
বা মেমোরি উত্স অপারেণ্ডের সাথে ডিএফ সেট করার পরিবর্তে lodsb
/ stosb
আওতার পরিবর্তে নিম্নমুখী হয়ে যাওয়া ALU নির্দেশিকায় ব্যবহার করা ভাল। সাধারণত আপনার যদি নিচের দিকে কিছুটা প্রয়োজন হয় তবে আপনার আরও একটি পয়েন্টার উপরে যেতে পারে, সুতরাং আপনার উভয়ের জন্য / ব্যবহার করার জন্য একাধিক std
এবং cld
পুরো ফাংশনে প্রয়োজন হবে । পরিবর্তে, কেবল উপরের দিকের জন্য স্ট্রিং নির্দেশাবলী ব্যবহার করুন। (স্ট্যান্ডার্ড কলিং কনভেনশনগুলি ফাংশন এন্ট্রিতে DF = 0 এর গ্যারান্টি দেয়, যাতে আপনি এটি ব্যবহার না করেই নিখরচায় ধরে নিতে পারেন )lods
stos
cld
8086 ইতিহাস: কেন এই এনকোডিংগুলি বিদ্যমান
মূল 8086 সালে, কুঠার খুব বিশেষ ছিল: নির্দেশাবলী পছন্দ lodsb
/ stosb
, cbw
, mul
/ div
এবং অন্যদের এটা পরোক্ষভাবে ব্যবহার করুন। এখনও এটি অবশ্যই; বর্তমান x86 8086 এর কোনও অপকড (কমপক্ষে সরকারীভাবে নথিভুক্ত কোনও নয়) ছাড়েনি। তবে পরে সিপিইউগুলি নতুন নির্দেশাবলী যুক্ত করেছে যা এএক্স এ প্রথমে অনুলিপি বা অদলবদল না করে জিনিসগুলি আরও ভাল / আরও কার্যকর উপায় দেয়। (অথবা 32-বিট মোডে EAX এ)
উদাহরণস্বরূপ 8086 এর পরে সংযোজনগুলির অভাব movsx
/ movzx
লোড বা সরানো + সাইন-প্রসার, বা 2 এবং 3-অপারেন্ডের অভাব রয়েছে imul cx, bx, 1234
যা একটি উচ্চ-অর্ধ ফলাফল তৈরি করে না এবং এতে কোনও অন্তর্নিহিত অপারেশন নেই।
এছাড়াও, ৮০86's-এর মূল বাধাটি ছিল নির্দেশনা-আনা, তাই কোড-আকারের জন্য অপ্টিমাইজ করা তখনকার পারফরম্যান্সের জন্য গুরুত্বপূর্ণ । 8086 এর আইএসএ ডিজাইনার (স্টিফেন মোর্স) সমস্ত বেসিক তাত্ক্ষণিক-এসসিআর ALU- নির্দেশাবলীর জন্য বিশেষ (E) AX / AL- গন্তব্য opcodes সহ এক্স / AL এর জন্য বিশেষ ক্ষেত্রে অনেকগুলি অপকোড কোডিং স্পেস ব্যয় করেছেন , কেবল অপকড + তাত্ক্ষণিক কোনও ModR / M বাইট ছাড়াই। 2-বাইট add/sub/and/or/xor/cmp/test/... AL,imm8
বা AX,imm16
বা (32-বিট মোডে) EAX,imm32
।
তবে এর জন্য বিশেষ কোনও মামলা নেই EAX,imm8
, সুতরাং নিয়মিত মোডআর / এম এনকোডিং add eax,4
সংক্ষিপ্ত।
অনুমানটি হ'ল আপনি যদি কিছু ডেটা নিয়ে কাজ করতে যাচ্ছেন তবে আপনি এটি এক্স / এএল-তে চাইবেন, সুতরাং এক্স এর সাথে একটি রেজিস্টার সন্ধান করা এমন কিছু ছিল যা আপনি করতে চেয়েছিলেন, সম্ভবত আরও একবারে এক্স এ রেজিস্টার অনুলিপি করার চেয়েও mov
।
8086 টি নির্দেশের এনকোডিংয়ের সমস্ত কিছুই এই দৃষ্টান্তকে সমর্থন করে, lodsb/w
EAX এর সাথে নকল করার জন্য বিশেষ বিশেষ কেস এনকোডিংয়ের মতো নির্দেশগুলি থেকে এমনকি এর গুণক / বিভাজনের ক্ষেত্রেও এর নিখুঁত ব্যবহার।
বহন করবেন না; এটি স্বয়ংক্রিয়ভাবে EAX- এ সমস্ত কিছু অদলবদল করার মতো জয় নয়, বিশেষত যদি আপনার 8-বিটের পরিবর্তে 32-বিট রেজিস্ট্রার সহ ইমিডিয়েটগুলি ব্যবহার করা প্রয়োজন। অথবা যদি আপনার একসাথে নিবন্ধগুলিতে একাধিক ভেরিয়েবলের অপারেশন প্রয়োজন হয় need বা আপনি যদি 2 টি রেজিস্ট্রার সহ নির্দেশাবলী ব্যবহার করেন তবে তা মোটেই তাড়াতাড়ি নয়।
তবে সর্বদা মনে রাখবেন: আমি কি এমন কিছু করছি যা EAX / AL এর চেয়ে কম হবে? আমি কীভাবে পুনরায় সাজিয়ে তুলতে পারি এটি আমার AL এ আছে বা আমি ইতিমধ্যে যা ব্যবহার করছি তার সাথে আমি AL এর আরও ভাল সুবিধা নিচ্ছি?
8-বিট এবং 32-বিট ক্রিয়াকলাপগুলিকে অবিচ্ছিন্নভাবে মিক্স করুন যখনই এটি করা নিরাপদ হন সুবিধা গ্রহণের জন্য (আপনার সম্পূর্ণ রেজিস্টার বা যে কোনও কিছুতে বহন করার দরকার নেই)।
push 200; pop edx
- আরম্ভের জন্য 3 বাইট ব্যবহার করুন।