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