x86-64 মেশিন কোড, 26 বাইট
31 C9 8D 71 01 89 F8 FF C1 99 F7 F9 85 D2 75 03 0F AF F1 39 F9 7C EE 89 F0 C3
উপরের কোডটি এমন একটি ফাংশন সংজ্ঞায়িত করে যা ( Gnu / ইউনিক্সে ব্যবহৃত সিস্টেম ভি AMD64 কলিং কনভেনশনEDI
অনুসরণ করে ) একটি একক প্যারামিটার (ইনপুট মান, ধনাত্মক পূর্ণসংখ্যার) গ্রহণ করে এবং এতে একটি একক ফলাফল (বিভাজকের পণ্য) প্রদান করেEAX
।
অভ্যন্তরীণভাবে, এটি পিজ্জা প্যান্টস 184 এর সি সাবমিশনের অনুরূপ (অত্যন্ত অদক্ষ) পুনরাবৃত্ত অ্যালগরিদম ব্যবহার করে বিভাজকের পণ্যকে গণনা করে । মূলত, এটি সকলের লুপের জন্য একটি কাউন্টার ব্যবহার করে 1 এবং ইনপুট মানের মধ্যে মানগুলি করে, বর্তমান পাল্টা মানটি ইনপুটটির বিভাজক কিনা তা পরীক্ষা করে। যদি তা হয় তবে এটি চলমান মোট পণ্যগুলিতে গুন করে।
অসম্পূর্ণ সমাবেশ ভাষা মেমোনিক্স:
; Parameter is passed in EDI (a positive integer)
ComputeProductOfDivisors:
xor ecx, ecx ; ECX <= 0 (our counter)
lea esi, [rcx + 1] ; ESI <= 1 (our running total)
.CheckCounter:
mov eax, edi ; put input value (parameter) in EAX
inc ecx ; increment counter
cdq ; sign-extend EAX to EDX:EAX
idiv ecx ; divide EDX:EAX by ECX
test edx, edx ; check the remainder to see if divided evenly
jnz .SkipThisOne ; if remainder!=0, skip the next instruction
imul esi, ecx ; if remainder==0, multiply running total by counter
.SkipThisOne:
cmp ecx, edi ; are we done yet? compare counter to input value
jl .CheckCounter ; if counter hasn't yet reached input value, keep looping
mov eax, esi ; put our running total in EAX so it gets returned
ret
এই IDIV
নির্দেশটি ডিভিডেন্ডের জন্য হার্ড-কোডড অপারেন্ডগুলি ব্যবহার করে আমার স্টাইলকে কিছুটা বিড়ম্বনা করে, তবে আমি মনে করি যে এটি এমন ভাষার জন্য বেশ ভাল যার কোনও বিল্ট-ইন নেই তবে বেসিক গাণিতিক এবং শর্তসাপেক্ষ শাখা রয়েছে!