Created
May 5, 2020 16:52
-
-
Save mkYYY/fca8bcf4f697950f3418117e2f4f5aed to your computer and use it in GitHub Desktop.
x86_64 AT&T assembly fizzbuzz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // $ 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