Skip to content
Assembly

循环求和 (1..N)

使用 dec/jnz 的计数循环对 1..N 求和。

#loops#arithmetic#control-flow

Code

assembly
; sum_to(N) -> 1+2+...+N    rdi=N, result in rax
section .text
global sum_to

sum_to:
    xor     eax, eax        ; accumulator = 0
    test    edi, edi
    jle     .done           ; if N <= 0, return 0

.loop:
    add     eax, edi        ; accumulate N, N-1, ...
    dec     edi
    jnz     .loop           ; repeat until edi == 0

.done:
    ret

; Faster closed form:  sum(N) = N*(N+1)/2
global sum_to_fast
sum_to_fast:
    mov     eax, edi
    add     eax, 1          ; N+1
    imul    eax, edi        ; N*(N+1)
    shr     eax, 1          ; /2
    ret