Mã máy x86-64, 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
Đoạn mã trên xác định một hàm lấy một tham số duy nhất (giá trị đầu vào, số nguyên dương) trong EDI
(theo quy ước gọi System64 AMD được sử dụng trên Gnu / Unix) và trả về một kết quả duy nhất (sản phẩm của ước số) EAX
.
Trong nội bộ, nó tính toán sản phẩm của các ước số bằng thuật toán lặp (cực kỳ kém hiệu quả), tương tự như đệ trình C của pizzapants184 . Về cơ bản, nó sử dụng bộ đếm để lặp qua tất cả các giá trị giữa 1 và giá trị đầu vào, kiểm tra xem giá trị bộ đếm hiện tại có phải là ước của đầu vào không. Nếu vậy, nó nhân số đó vào tổng sản phẩm đang chạy.
Ngôn ngữ lắp ráp lộn xộn:
; 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
Thực tế là IDIV
hướng dẫn sử dụng các toán hạng được mã hóa cứng để chia cổ tức theo kiểu của tôi một chút, nhưng tôi nghĩ rằng điều này khá tốt cho một ngôn ngữ không có các nhánh số học và điều kiện cơ bản!