アセンブリでfizzbuzz

.set LOOP_END, 60
.set LOOP_START, 1
.set FIZZBUZZ_NUM, 15
.set FIZZ_NUM, 3
.set BUZZ_NUM, 5
.set EXIT, 60
.set EXIT_CODE, 1

.data
fizz:
    .string "Fizz"

buzz:
    .string "Buzz"

fizzbuzz:
    .string "FizzBuzz"

num_str:
    .string "%d\n"

end_string:
    .string "\nComplete FizzBuzz!!"

.text
.globl main

fizz_write:
    leaq fizz(%rip), %rdi
    call puts@PLT
    jmp loop_inc

buzz_write:
    leaq buzz(%rip), %rdi
    call puts@PLT
    jmp loop_inc

fizzbuzz_write:
    leaq fizzbuzz(%rip), %rdi
    call puts@PLT
    jmp loop_inc

num_write:
    leaq num_str(%rip), %rdi
    movq %r13, %rsi
    xor %rax, %rax
    call printf@PLT
    jmp loop_inc

loop_process:
    cmpq %r13, %r12
    jl end_process

    movq  $0, %rdx
    movq %r13, %rax
    movq $FIZZBUZZ_NUM, %r14
    divq %r14
    cmpq $0, %rdx
    je fizzbuzz_write

    movq  $0, %rdx
    movq %r13, %rax
    movq $FIZZ_NUM, %r14
    divq %r14
    cmpq $0, %rdx
    je fizz_write

    movq  $0, %rdx
    movq %r13, %rax
    movq $BUZZ_NUM, %r14
    divq %r14
    cmpq $0, %rdx
    je buzz_write

    movq  $0, %rdx
    movq $0, %rax
    jmp num_write

loop_inc:
    inc %r13
    jmp loop_process

main:
    movq $LOOP_START, %r13    /* r13をloopカウントにする */
    movq $LOOP_END, %r12
    jmp loop_process

end_process:
    leaq end_string(%rip), %rdi
    call puts@PLT
    movq $EXIT, %rax  /* exit */
    movq $EXIT_CODE, %rdi
    syscall
    ret