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
उपरोक्त कोड एक फ़ंक्शन को परिभाषित करता है जो एकल पैरामीटर (इनपुट मान, एक सकारात्मक पूर्णांक) को EDI
(निम्नलिखित में) लेता है सिस्टम वी AMD64 बुला सम्मेलन जीएनयू / यूनिक्स पर इस्तेमाल किया), और में एक भी परिणाम (divisors के उत्पाद) देता है EAX
।
आंतरिक रूप से, यह pizzapants184 के C सबमिशन के समान (अत्यंत अक्षम) पुनरावृत्ति एल्गोरिथ्म का उपयोग करते हुए विभाजकों के उत्पाद की गणना करता है । मूल रूप से, यह एक काउंटर के माध्यम से लूप का उपयोग करता है 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
निर्देश डिविडेंड के लिए हार्ड-कोडेड ऑपरेंड्स का उपयोग करता है, मेरी शैली को थोड़ा क्रैम्प करता है, लेकिन मुझे लगता है कि यह एक ऐसी भाषा के लिए बहुत अच्छा है जिसमें कोई अंतर्निहित इंसिमेंट और सशर्त शाखाएं नहीं हैं!