x86-64 (এবং x86-32) মেশিন কোড, 13 15 13 বাইট
পরিবর্তণের:
বাগফিক্স: প্রথম সংস্করণটি কেবলমাত্র জি = 0 এক্সএফ পরীক্ষা করছে, আর আর বি-তে 0 হওয়ার দরকার নেই, আমি স্থানটিতে পটভূমিটি পরিবর্তন করেছি যাতে শর্ট-ফর্ম এনকোডিংয়ের জন্য আমি lodsd
ফোর পিক্সেল রাখতে পারি (5 বাইট) ) এর পরিবর্তে (3 বাইট)eax
cmp eax, imm32
cmp dh,0xff
2 বাইট সংরক্ষণ করুন: লক্ষ্য করেছেন যে জায়গায় বিজি সংশোধন করার জন্য মেমরি অপারেন্ড ব্যবহারের অনুমতি দেওয়া হয়েছে cmov
, একটি 2-বাইট mov
লোড সংরক্ষণ করা (এবং কোনও ক্ষেত্রে নিবন্ধক সংরক্ষণ করা উচিত)।
এটি x86-64 সিস্টেম ভি কলিং কনভেনশন অনুসরণ করে যা এই সিগনেচারের মাধ্যমে সরাসরি সি বা সি ++ (x86-64 নন-উইন্ডোজ সিস্টেমে) থেকে কলযোগ্য:
void chromakey_blend_RGB32(uint32_t *background /*rdi*/,
const uint32_t *foreground /*rsi*/,
int dummy, size_t pixel_count /*rcx*/);
চিত্রের ফর্ম্যাটটি আরজিবি0 32 বিপিপি, প্রতিটি পিক্সেলের মধ্যে দ্বিতীয় সর্বনিম্ন মেমরি ঠিকানার সবুজ উপাদান সহ component ফোরগ্রাউন্ড পটভূমি চিত্র ইন-জায়গা রুপান্তরিত করা হয়েছে। pixel_count
সারি * কলামগুলি। এটি সারি / কলামগুলি সম্পর্কে চিন্তা করে না; এটি কেবল ক্রোমিকি মিশ্রিত করে তবে আপনি উল্লেখ করেছেন মেমরির অনেকগুলি ডিফল্ট।
আরজিবিএ (0xFF হওয়া আবশ্যক সহ) এর জন্য একটি ভিন্ন ধ্রুবক ব্যবহার করা প্রয়োজন, তবে ফাংশনের আকারে কোনও পরিবর্তন করা দরকার। ফোরগ্রাউন্ড DWORD গুলি 4 বাইটে সঞ্চিত 32-বিট ধ্রুবকের বিপরীতে নির্ভুল সমতার জন্য তুলনা করা হয়, যাতে কোনও পিক্সেল-অর্ডার বা ক্রোমা-কী রঙ সহজেই সমর্থন করা যায়।
একই মেশিন কোডটি 32-বিট মোডেও কাজ করে। 32-বিট হিসাবে একত্রিত rdi
হতে edi
উত্সে পরিবর্তন করুন । All৪-বিট হয়ে যাওয়া অন্যান্য সমস্ত নিবন্ধগুলি অন্তর্ভুক্ত (লজড / স্টোসড এবং লুপ), এবং অন্যান্য স্পষ্টত রেজিগুলি 32-বিট থাকে। তবে মনে রাখবেন যে আপনাকে 32-বিট সি থেকে কল করার জন্য একটি মোড়কের দরকার হবে, কারণ স্ট্যান্ডার্ড x86-32 কলিং কনভেনশনগুলির কোনওটিই x86-64 SysV হিসাবে একই রেগ ব্যবহার করে না।
এনএএসএম তালিকা (মেশিন-কোড + উত্স), আরও জটিল নির্দেশাবলী কী করে তার বিবরণ সহ asm প্রবর্তকদের জন্য মন্তব্য করেছে। (নির্দেশের রেফারেন্স ম্যানুয়ালটি সদৃশ করা সাধারণ ব্যবহারে খারাপ স্টাইল)
1 ;; inputs:
2 ;; Background image pointed to by RDI, RGB0 format (32bpp)
3 ;; Foreground image pointed to by RSI, RGBA or RGBx (32bpp)
4 machine ;; Pixel count in RCX
5 code global chromakey_blend_RGB32
6 bytes chromakey_blend_RGB32:
7 address .loop: ;do {
8 00000000 AD lodsd ; eax=[rsi], esi+=4. load fg++
9 00000001 3D00FF0000 cmp eax, 0x0000ff00 ; check for chromakey
10 00000006 0F4407 cmove eax, [rdi] ; eax = (fg==key) ? bg : fg
11 00000009 AB stosd ; [rdi]=eax, edi+=4. store into bg++
12 0000000A E2F4 loop .loop ;} while(--rcx)
13
14 0000000C C3 ret
## next byte starts at 0x0D, function length is 0xD = 13 bytes
এই তালিকা থেকে মূল এনএএসএম উত্সটি পেতে, প্রতিটি লাইনের নেতৃস্থানীয় 26 টি অক্ষর দিয়ে স্ট্রিপ করুন <chromakey.lst cut -b 26- > chromakey.asm
। আমি এটি
nasm -felf64 chromakey-blend.asm -l /dev/stdout | cut -b -28,$((28+12))-
NASM তালিকাগুলি দিয়ে তৈরি করেছিলাম মেশিন-কোড এবং উত্সের মধ্যে আমার চেয়ে বেশি ফাঁকা কলামগুলি ছেড়ে যায়। কোনও অবজেক্ট ফাইল তৈরি করতে আপনি সি বা সি ++ এর সাথে লিঙ্ক করতে পারেন, ব্যবহার করুন nasm -felf64 chromakey.asm
। (বা yasm -felf64 chromakey.asm
)
অরক্ষিত , তবে আমি যথেষ্ট আত্মবিশ্বাসী যে লোড / লোড / সেন্টিমোভ / স্টোরের প্রাথমিক ধারণাটি দুর্দান্ত, কারণ এটি খুব সহজ।
আমি কলকারীর ক্রিয়াকলাপটির মধ্যে ধ্রুবককে হার্ড-কোডিংয়ের পরিবর্তে অতিরিক্ত আরগ হিসাবে ক্রোমা-কি ধ্রুবক (0x00ff00) পাস করার প্রয়োজন হলে আমি 3 বাইট সংরক্ষণ করতে পারতাম। আমি মনে করি না যে সাধারণ নিয়মগুলি আরও জেনেরিক ফাংশন লেখার মঞ্জুরি দেয় যার জন্য কলার সেট আপ করার ধ্রুবক থাকে। তবে যদি তা হয় তবে তৃতীয় আরগটি (বর্তমানে dummy
) edx
x86-64 SysV ABI তে পাস করা হবে । কেবল cmp eax, 0x0000ff00
(5 বি) থেকে cmp eax, edx
(2 বি) পরিবর্তন করুন ।
এসএসই 4 বা এভিএক্সের সাহায্যে আপনি তুলনা মুখোশ দ্বারা নিয়ন্ত্রিত 32-বিট উপাদান আকারের ভেরিয়েবল-মিশ্রণটি দিয়ে pcmpeqd
এবং এটি blendvps
করতে দ্রুত (তবে বৃহত্তর কোড আকার) করতে পারেন। (এর সাথে pand
, আপনি হাই বাইট উপেক্ষা করতে পারেন)। প্যাক করা আরজিবি ২৪ এর জন্য, আপনি সম্ভবত pcmpeqb
2x pshufb
+ ব্যবহার করতে পারেন pand
যেখানে বাইটে সত্য পেতে সেখানে p পিক্সেলের সমস্ত 3 উপাদান মিলে যায় pblendvb
।
(আমি জানি এটি কোড-গল্ফ, তবে স্কেলারের পূর্ণসংখ্যার সাথে যাওয়ার আগে আমি এমএমএক্স চেষ্টা করার বিষয়টি বিবেচনা করেছি))