x86-64 Makine Kodu, 26 bayt
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
Yukarıdaki kod EDI
, System V AMD64 çağrı kuralını izleyerek tek bir parametre (giriş değeri, pozitif bir tamsayı) alan bir işlevi tanımlar. Gnu / Unix'te kullanılan ve içinde tek bir sonuç (bölenlerin ürünü)EAX
.
Dahili olarak, pizzapants184'ün C sunumuna benzer şekilde (son derece verimsiz) bir yinelemeli algoritma kullanarak bölenlerin ürününü hesaplar . Temel olarak, tüm döngü boyunca bir sayaç kullanır 1 ile giriş değeri arasındaki değerler arasında ve mevcut sayaç değerinin girişin bölen olup olmadığını kontrol eder. Eğer öyleyse, bunu çalışan toplam ürünle çarpar.
Ungolfed assembly dili anımsatıcıları:
; 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
Aslında IDIV
talimat temettü için kodlanmış işlenen kullanır tarzımı biraz kramp, ama bu bir hayır yerleşik ins edilen dile ama temel aritmetik ve koşullu dallar için oldukça iyi olduğunu düşünüyorum!