Skip to content

Instantly share code, notes, and snippets.

@mkYYY
Created May 5, 2020 16:52
Show Gist options
  • Select an option

  • Save mkYYY/fca8bcf4f697950f3418117e2f4f5aed to your computer and use it in GitHub Desktop.

Select an option

Save mkYYY/fca8bcf4f697950f3418117e2f4f5aed to your computer and use it in GitHub Desktop.
x86_64 AT&T assembly fizzbuzz
// $ gcc -o fizzbuzz fizzbuzz.S
// $ ./fizzbuzz <natural number>
.section .rodata
s_fizz: .asciz "Fizz\n"
s_buzz: .asciz "Buzz\n"
s_fizzbuzz: .asciz "FizzBuzz\n"
s_ldformat: .asciz "%ld\n"
.section .text
.extern printf
.extern strtoul
.globl main
main:
subq $16, %rsp
movq %rbx, 8(%rsp)
cmpl $2, %edi
jnz loop_end
movq 8(%rsi), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq strtoul
decq %rax
mov %rax, %rbp
do_main:
xorl %ebx, %ebx
incb %bl // start from 1
loop_begin:
movq %rbx, %rdi
callq print
cmpq %rbp, %rbx
jg loop_end
incq %rbx
jmp loop_begin
loop_end:
xorl %edi, %edi
movl $0x3c, %eax
syscall
print:
movq %rdi, %rax
xorl %edx, %edx
movl $15, %ecx
divq %rcx
testq %rdx, %rdx
jnz L_isfive
movl $9, %edx
leaq s_fizzbuzz(%rip), %rsi
jmp L_doprint
L_isfive:
movq %rdi, %rax
xorl %edx, %edx
movl $5, %ecx
divq %rcx
testq %rdx, %rdx
jnz L_isthree
movl $5, %edx
leaq s_buzz(%rip), %rsi
jmp L_doprint
L_isthree:
movq %rdi, %rax
xorl %edx, %edx
movl $3, %ecx
divq %rcx
testq %rdx, %rdx
jnz L2_print
movl $5, %edx
leaq s_fizz(%rip), %rsi
jmp L_doprint
L2_print:
// print raw number
movq %rdi, %rsi
leaq s_ldformat(%rip), %rdi
xorl %eax, %eax
callq printf
ret
L_doprint:
movl $1, %edi
movl $1, %eax
syscall
ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment