x86-64 Kode Mesin, 26 byte
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
Kode di atas mendefinisikan fungsi yang mengambil parameter tunggal (nilai input, bilangan bulat positif) di EDI
(mengikuti konvensi pemanggilan Sistem V AMD64 yang digunakan pada Gnu / Unix), dan mengembalikan hasil tunggal (produk pembagi) di EAX
.
Secara internal, ini menghitung produk pembagi menggunakan algoritma iteratif (sangat tidak efisien), mirip dengan pengiriman C pizzapants184 . Pada dasarnya, ia menggunakan penghitung untuk mengulang semua nilai antara 1 dan nilai input, memeriksa untuk melihat apakah nilai penghitung saat ini adalah pembagi input. Jika demikian, itu akan berlipat ganda menjadi total produk yang berjalan.
Mnemonik bahasa assembly yang tidak disatukan:
; 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
Fakta bahwa IDIV
instruksi menggunakan operan kode keras untuk dividen kram gaya saya sedikit, tapi saya pikir ini cukup baik untuk bahasa yang tidak memiliki built-in tetapi aritmatika dasar dan cabang kondisional!